TIL - day20

정상화·2023년 3월 20일
0

TIL

목록 보기
16/46
post-thumbnail

@Transactional

테스트코드의 메서드에 이 애노테이션을 붙이면 메서드가 끝날 때까지 DB세션이 유지된다.

@Transactional
    @Test
    void testJpa() {
        Optional<Question> oq = questionRepository.findById(2);
        assertTrue(oq.isPresent());
        Question q = oq.get();

        List<Answer> answerList = q.getAnswerList();

        assertEquals(1, answerList.size());
        assertEquals("네 자동으로 생성됩니다.",
                answerList.get(0).getContent());
    }

DTO

엔티티는 DB와 직접적으로 맞닿기 때문에 엔티티를 모델의 데이터로 사용하는 것은 위험하다. DTO는 전송될 데이터만을 담은 클래스로 직접 엔티티를 넘기는 것보다 안전하다.
엔티티와 DTO간의 변환은 서비스 단에서 이루어진다.

일대다

JPA에서 일대다는 DB에서 일대다와 비슷하나 자바의 객체는 관련된 여러 객체를 참조 가능하다는 차이가 있다.
즉, 데이터베이스에선 '다'에서 '일'을 보는 것만 가능했으나 JPA에선 '일'이 '다'를 보는 것도 가능하다.

일대다의 '일'

@Getter
@Setter
@Entity
public class Question {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(length = 200)
    private String subject;

    @Column(columnDefinition = "TEXT")
    private String content;

    private LocalDateTime createDate;

    @OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
    private List<Answer> answerList;
}

일대다의 '다'

@Getter
@Setter
@Entity
public class Answer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(columnDefinition = "TEXT")
    private String content;

    private LocalDateTime createDate;

    @ManyToOne
    private Question question;
}

Question클래스가 Answer를 리스트형태로 참조하는 것을 알 수 있다. 이 경우 '일'에는 '다' 클래스를 참조한다는 것을 명시해야한다.(mappedBy)

profile
백엔드 희망

0개의 댓글