TIL

TIL - 2024/09/30

기석김 2024. 9. 30. 22:38

벌써 곧 10월이다. 여행이 예정돼 있어서 다음 TIL은 10월 14일부터 올릴 예정이다.

여행도 가고, 푹 쉬고 와서 다시 열심히 달려보겠습니다. 일단 오늘도 파이팅

 

처음에 package를 생성하고 구조를 잡는다

예를 들어 ) controller, dto, entity, repository, service 이렇게 말이다.

 

entity는 5형제 어노테이션이 있다.

@Getter @Entity @NoArgsConstructor @Id @GeneratedValue(strategy = GenerationType.IDENTITY)

 

@Getter는 getter 메서드 자동 생성 해 주고

@Entity는 db 테이블과 매핑되는 엔티티인 걸 알려주고

@NoArgsConstructor는 파라미터가 없는 기본 생성자를 자동으로 생성

@Id는 기본 키

@GeneratedValue(strategy = GenerationType.IDENTITY)은 기본 키 생성을 자동으로 처리

 

Service는 2형제가 있다.

@Service @RequiredArgsConstructor

 

@Service는 비즈니스 로직을 처리하는 서비스 계층을 나타냄

@RequiredArgsConstructor는 초기화되지 않는 final 필드 or @NonNull이 붙은 필드에 대해 생성자 생성해 줌

의존성 주입을 위해 생성자를 자동으로 생성하여 코드가 간결해지고 유지 보수가 용이해진다.

 

Controller도 어노테이션 2개 있다.

@RestController @RequiredArgsConstructor

 

CRUD에서 R이 아닌 로직이 포함된 컨트롤러를 제외한 메소드에는 @Transactional을 붙이면 좋다.

why? r 빼고 나머지 cud는 db에 변화를 준다. @Transactional을 붙이면, 데이터의 무결성을 유지하고,

오류 발생 시 롤백 해서 안전하게 데이터 처리 가능

 

dto에 @getter 잊으면 안 됨

 

dto는 뭐의 약자일까? > data transfer object

dto를 사용하는 이유? > Controller와 Service 사이의 결합도를 낮추기 위해, 유지 보수성과 확장성을 높임.

 

결론: 3 Layered Architecture 사용 이유 → 결합도를 낮춰서 (각자의 역할에 충실) + 유지 보수성 + 확장성

 

@OneToMany는 @ManyToOne(fetch = FetchType.LAZY)이 없으면 존재할 수 없다.

(이건 법칙) → ManyToOne부터 일단 넣고 생각하기

 

즉, 자식 엔티티가 부모 엔티티를 참조해야 함

 

@ManyToOne(fetch = FetchType.LAZY) 더 개수가 많은 놈한테 건다.

ex) 댓글 vs 게시글 → 댓글에 달아야 함, 

 

N:M은 중간 테이블 필요하다. (리스트를 필드에 선언할 수 없기 때문에)

중간 테이블에 @ManyToOne(fetch = FetchType.LAZY) 2개 선언.

 

@ManyToOne에게 무조건 해야되는거 

     @ManyToOne(fetch = FetchType.LAZY) 

     @JoinColumn(name = “상대방id”)

 

@OneToMany 무조건 해야되는거

    @OneToMany(mappedBy = “나자신”)

 

-----------------------

10월 14일부터 달리겠습니다 ~ 잘 쉬고 여행 잘 하다 오겠습니다 파이팅~