스프링과 JPA 기반 웹 애플리케이션 개발 #39 관심 주제(Tag) 도메인(+ JPA H2 DB 설정)

Jake Seo·2021년 6월 8일
0

스프링과 JPA 기반 웹 애플리케이션 개발 #39 관심 주제 도메인

해당 내용은 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발의 강의 내용을 바탕으로 작성된 내용입니다.

강의를 학습하며 요약한 내용을 출처를 표기하고 블로깅 또는 문서로 공개하는 것을 허용합니다 라는 원칙 하에 요약 내용을 공개합니다. 출처는 위에 언급되어있듯, 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발입니다.

제가 학습한 소스코드는 https://github.com/n00nietzsche/jakestudy_webapp 에 지속적으로 업로드 됩니다. 매 커밋 메세지에 강의의 어디 부분까지 진행됐는지 기록해놓겠습니다.


관심 주제(Tag) 도메인

  • 관심 주제(Tag)는 엔티티인가 밸류인가?
    • 엔티티와 밸류의 차이는 DB에서 테이블로 들어가는지 컬럼으로 들어가는지이다.
    • 엔티티다.
      • 태그 독자적인 라이프사이클이 있고, 다른 곳(Study)에서도 참조하기 때문이다.
      • 밸류라면 독자적인 라이프사이클이 없고 엔티티에 종속되어야 한다.
  • Tag 엔티티
    • Id
    • Title (unique)
  • 객체 관점에서의 관계
    • Account -> Tag
    • @ManyToMany
    • Account에서 Tag를 참조하는 단방향 관계
  • 관계 DB 관점에서의 관계
    • Account <- AccountTag -> Tag
      • 중간에 매개 테이블을 하나 더 생성하여 하는 편이 좋을듯
      • Account_Tag에서 AccountPK 참조
      • Account_Tag에서 TagPK 참조

Tag 엔티티 작성

@Entity
@Getter @Setter @EqualsAndHashCode(of = "id")
@Builder @AllArgsConstructor @NoArgsConstructor
public class Tag {
    @Id @GeneratedValue
    private Long id;

    private String title;
}

AccountTag 엔티티 작성

@Entity
public class AccountTag {
    // 조인 컬럼
    @ManyToOne
    @JoinColumn(name = "account_id")
    private Account account;

    @ManyToOne
    @JoinColumn(name = "tag_id")
    private Tag tag;

    // 기본 컬럼
    @Id @GeneratedValue
    private Long id;
}

Account 엔티티와 Tag 엔티티가 바로 @ManyToMany를 갖지 않고, 유연성을 위해 가운데에 AccountTag라는 엔티티를 하나 더 만들어주었다.

그리고 각 AccountTag@OneToManyAccountTag 엔티티와 관계를 갖는다.

Account 엔티티에 내용 추가

...
    // 조인 컬럼들
    // mappedBy 에는 AccountTag 객체의 어떤 값을 참조하여 매핑될 것인지를 선택하는 것이므로,
    // Account 타입의 account 밸류를 참조한다고 적는다.
    @OneToMany(mappedBy = "account")
    private List<AccountTag> accountTags = new ArrayList<>();
...

Account 엔티티는 회원 정보를 불러올 때, 태그 정보를 같이 불러올 일이 있으므로 위와 같이 @OneToMany를 써주었다. mappedBy에 들어가는 내용은 내가 참조되는 테이블에서 나를 가리키는 필드명이 무엇인지 적는 것이다.

공식문서의 설명에는 관계를 소유하는 필드명을 적으라고 되어있다. 외래키를 가지는 곳이 연관관계의 주인이므로, 연관관계의 주인은 항상 @XXToManyMany이다. 그래서 AccountTag 엔티티의 Account 필드에 의해서 매핑되도록 mappedBy = "account"를 적어주면 된다.

디비 연결 세팅

어떤 쿼리들이 날아가는지 구경하기 위해 디비를 연결했다. 디비는 임의로 h2 디비를 쓸 것이다.

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.url=jdbc:h2:tcp://localhost/~/test;

spring.jpa.hibernate.ddl-auto=create
# spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true

logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type.descriptor.sql=trace

위와 같이 세팅해주었다. 위와 같이 세팅하면 어떤 SQL을 날렸는지 나오며, 값 추적도 가능하다.

profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글