스프링과 JPA 기반 웹 애플리케이션 개발 #39 관심 주제 도메인
해당 내용은 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발의 강의 내용을 바탕으로 작성된 내용입니다.
강의를 학습하며 요약한 내용을 출처를 표기하고 블로깅 또는 문서로 공개하는 것을 허용합니다 라는 원칙 하에 요약 내용을 공개합니다. 출처는 위에 언급되어있듯, 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발입니다.
제가 학습한 소스코드는 https://github.com/n00nietzsche/jakestudy_webapp 에 지속적으로 업로드 됩니다. 매 커밋 메세지에 강의의 어디 부분까지 진행됐는지 기록해놓겠습니다.
Account
-> Tag
@ManyToMany
Account
에서 Tag
를 참조하는 단방향 관계Account
<- AccountTag
-> Tag
Account_Tag
에서 Account
의 PK
참조Account_Tag
에서 Tag
의 PK
참조@Entity
@Getter @Setter @EqualsAndHashCode(of = "id")
@Builder @AllArgsConstructor @NoArgsConstructor
public class Tag {
@Id @GeneratedValue
private Long id;
private String title;
}
@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
라는 엔티티를 하나 더 만들어주었다.
그리고 각 Account
와 Tag
는 @OneToMany
로 AccountTag
엔티티와 관계를 갖는다.
...
// 조인 컬럼들
// mappedBy 에는 AccountTag 객체의 어떤 값을 참조하여 매핑될 것인지를 선택하는 것이므로,
// Account 타입의 account 밸류를 참조한다고 적는다.
@OneToMany(mappedBy = "account")
private List<AccountTag> accountTags = new ArrayList<>();
...
Account
엔티티는 회원 정보를 불러올 때, 태그 정보를 같이 불러올 일이 있으므로 위와 같이 @OneToMany
를 써주었다. mappedBy
에 들어가는 내용은 내가 참조되는 테이블에서 나를 가리키는 필드명이 무엇인지 적는 것이다.
공식문서의 설명에는 관계를 소유하는 필드명을 적으라고 되어있다. 외래키를 가지는 곳이 연관관계의 주인이므로, 연관관계의 주인은 항상 @XXToMany
의 Many
이다. 그래서 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을 날렸는지 나오며, 값 추적도 가능하다.