[hodolog] 작성글 저장 - 게시글 저장 구현[4]

Euiyeon Park·2025년 2월 19일
post-thumbnail

✨ Entity(엔티티) 작성

  • 엔티티는 테이블과 1:1로 매핑되는 객체
  • 데이베이스의 행(row)을 표현하며, 데이터를 담고 있음
  • JPA에서는 @Entity 어노테이션을 사용해 정의

🪄 @Lob

  • JPA가 제공하는 어노테이션
  • @Lob 어노테이션이 붙은 필드를 대용량 데이터로 취급해
    데이터베이스의 BLOB 또는 CLOB 컬럼에 저장하도록 지정
    • BLOB(Binary Large Object) : 바이너리 데이터 저장(이미지, 동영상, 파일)
    • CLOB(Character Large Object) : 긴 문자열 데이터를 저장하는데 사용

🪄 @NoArgsConstructor

  • @NoArgsConstructor는 Lombok에서 제공하는 어노테이션으로,
    기본 생성자를 자동으로 생성

🪄 Entity와 @NoArgsConstructor

Entity 클래스에 왜 @NoArgsConstructor를 사용할까?

1. JPA가 프록시 생성을 위해 필요

  • JPA는 엔티티 객체를 영속성 컨텍스트에서 관리하고,
    필요할 때 프록시 객체를 생성한다.
  • 이 과정에서 기본 생성자가 필요하기 때문에 @NoArgsConstructor를 사용한다.
  • 기본 생성자가 없으면 JPA가 프록시를 생성할 때 예외가 발생한다.
  • JPA 엔티티에는 기본 생성자가 필수적이며,
    @NoArgsConstructor를 사용해 자동으로 생성한다.

💡access = AccessLevel.PROTECTED

  • 생성자의 접근 수준을 설정하는 옵션
  • 의도치 않은 생성자 호출로 객체의 상태가 불완전해지지 않도록 하기 위함

2. Spring에서 리플렉션을 사용할 때 필요

  • Spring에서는 빈(Bean) 생성 또는 객체 변환(JSON 역직렬화) 과정에서
    기본 생성자를 필요로 하는 경우가 많다.
  • 기본 생성자가 없으면 객체를 생성할 수 없어 오류가 발생할 수 있다.
@Entity
@NoArgsConstructor(access = AccessLevel.PUBLIC)
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @Lob
    private String content;
}

✨ 의존성 주입과 @RequiredArgsConstructor

🪄 필드 주입 - 지양

  • 왜? 불변성 보장 부족 문제
  • 필드 주입은 리플렉션을 사용해 주입하기 때문에 final을 선언할 수 없다.

🪄 생성자 주입 - 지향

  • 왜? 불변성 보장 가능
  • 생성자 호출시 의존성이 반드시 주입되어야하므로 이후 변경 불가능하다.

🪄 @RequiredArgsConstructor - Lombok

  • Lombok이 제공하는 어노테이션으로,
    필수 필드(final)만을 포함하는 생성자를 자동으로 생성
  • @RequiredArgsConstructor생성자 주입이 자동으로 적용된다.
  • 생성자 주입의 장점을 그대로 유지하면서 boilerplate 코드를 줄 일 수 있다.
@RequiredArgsConstructor
public class OrderService {
    private final PaymentService paymentService; // 생성자 주입 대상

    public void processOrder() {
        paymentService.pay();
    }
}
  • 위의 코드는 @RequiredArgsConstructor에 의해
    Lombok이 자동으로 아래와 같은 생성자를 만들어 준다.
public OrderService(PaymentService paymentService) {
    this.paymentService = paymentService;
}

✨ 테스트 코드의 독립성과 반복 가능성

🪄 독립성

  • 각 테스트가 서로 간섭없이 독립적으로 실행될 수 있음을 의미
  • 하나의 테스트가 다른 테스트의 실행 결과나 상태에 의존❌

독립성 보장 전략

  • 테스트 전에 필요한 모든 상태 초기화
  • 테스트 후에 테스트 환경을 정리
  • Mock 객체 초기화
  • 데이터베이스 트랜잭션 롤백

🪄 반복 가능성

  • 테스트를 여러 번 실행해도 항상 동일한 결과를 보장
  • 테스트 환경과 실행 순서가 달라져도 결과가 일정해야 함

반복 가능성 보장 전략

  • Mock 객체 활용

🪄 독립성과 반복 가능성 보장 전략

  1. MockStub 활용 - 외부 의존성 제거, 예상된 동작 시뮬레이션
  2. JUnit의 @BeforeEach@AfterEach 사용 - 테스트 전후 초기화 및 정리 작업
  3. 데이터베이스 트랜잭션 관리
    @BeforeEach
    void clean(){
        postRepository.deleteAll();
    }
profile
"개발자는 해결사이자 발견자이다✨" - Michael C. Feathers

0개의 댓글