Notice
Recent Posts
Recent Comments
Link
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

나만의 개발 로그 | 고민 로그

23.01.30 TIL 본문

TIL&WIL

23.01.30 TIL

ultramancode 2023. 1. 31. 02:34

☑️ 생성자에서 연관관계까지 처리하지 말자

// 생성자에 연관관계 편집 로직까지 넣은 경우(이렇게 사용 x)
public Order(User user, Item item) { 
this.user = user; // INSERT 
this.addItem(item); // flush 시 UPDATE 가능성 
}

 

문제 설명
단일 책임 원칙 위배 “객체 생성”과 “연관관계 변경”은 성격이 다름
불필요한 UPDATE 발생 영속성 컨텍스트 flush 시 INSERT → UPDATE 두 번 기록될 수 있음
 

권장: 연관관계 편의 메서드로 분리

@Entity 
public class Order { 

@ManyToOne 
private User user; 
@OneToMany(mappedBy = "order") 
private List<OrderItem> items = new ArrayList<>(); 

protected Order() {} // JPA 기본 생성자 

public Order(User user) { 
// 진짜 생성 책임만 
this.user = user; 
} 

// 연관관계 편의 메서드 
public void addItem(Item item, int qty) { 
OrderItem oi = new OrderItem(this, item, qty); 
items.add(oi); 
} 

}

☑️ DTO 변환 위치: 서비스 vs DTO 내부

 

전략 장점 단점
서비스 계층에서 for 루프 컨트롤러·DTO가 깔끔 서비스 코드가 장황해질 수 있음
DTO에 정적 팩터리 메서드 테스트·재사용 편리 DTO가 JPA 엔티티에 의존할 위험
 

-> 팀 컨벤션만 맞는다면 둘 중 뭘 사용해도 괜찮은 듯.. 단, 변환 로직이 길어지면 MapStruct·ModelMapper 등 매핑 툴을 고려하기!

 


☑️ 엔티티가 SQL 예약어와 충돌할 때

@Entity 
@Table(name = "orders") // 실제 테이블명만 변경 
public class Order { ... }
  • 엔티티 클래스 이름은 도메인 용어(order) 그대로 유지
  • 백엔드·프론트 코드 일관성을 깨지 않고도 “order” 예약어 문제 해결

☑️ 엔티티 코드 정렬 예시 (현재 우리 조 컨벤션)

  1. 필드(컬럼) → 2. 생성자 → 3. 연관관계 필드 → 4. 연관관계 편의 메서드 → 5. 비즈니스 메서드
    -> 코드 리뷰 난이도 ↓ & 자동 정렬 플러그인과 충돌 최소화

☑️리스트? Page? Slice?

반환 타입 특징 언제 사용하는지
List<T> 쿼리 1회, 토탈 없음 “10개만 긁어오면 끝”
Page<T> 쿼리 2회 (SELECT + COUNT) 전체 페이지 수·총 건수 필요
Slice<T> 쿼리 1회 (COUNT 없음) 다음 페이지 존재 여부만 알면 충분할 때
Slice<Post> slice = postRepo.findTop20ByAuthorId( authorId, PageRequest.of(page, 20));
  • 토탈 카운트 쿼리가 비싼 대용량 테이블이면 Slice 가 체감 차이를 보임
  • 무한 스크롤 API (“다음 페이지가 있나?”)에 적합.

'TIL&WIL' 카테고리의 다른 글

23.02.01 TIL  (1) 2023.02.02
23.01.31 TIL  (0) 2023.02.01
23.01.26 TIL  (0) 2023.01.26
23.01.18 TIL  (0) 2023.01.19
23.01.14 TIL  (1) 2023.01.14
Comments