Spring Boot (+ RESTful)

Spring Boot - 자동 구성 사용자 정의 / # Project 03 - 1:N (OneToMany) DB/Entity Modeling

wy-family 2024. 12. 17. 13:32

application.properties 를 yml 로 바꿔보겠다.

 

properties 대신에 yml 을 쓰면 된다.

내부 코드가 자동으로 바뀌는 건 아니라서 yml <-> properties 컨버팅 사이트에서 바꿔서 복붙해주자.

 

@Entity 클래스가 가지고 있는 멤버의 변수 이름이 table 열의 이름으로 바뀔 때, 카멜 케이스 표기법에서 스네이크 케이스 표기법으로 자동으로 바뀌는 설정이 되어 있다고 했었다.

그런데, 그냥 @Entity 클래스의 멤버의 변수 이름을 그대로 table 열의 이름으로 사용하고 싶다면, 간단하게 설정을 추가해주면 된다.

yml 파일에서는 저렇게 추가하면 된다.

만약 properties 파일이었다면,

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

이라고 입력해줬으면 된다.

 

여기서는 저 설정을 넣지 않도록 하겠다.


 

지난 번까지는 book 정보를 모두 보여주는 것까지는 했었다.

그리고 각 book 정보 마다 View Details 라는 버튼을 만들었다. 하지만 그 다음이 없었다.

 

이제는 Review 라는 클래스를 만들어서, 책 1권마다 리뷰가 있을 수 있는데, 그걸 PK, FK 로 연결을 지어주려고 한다.

즉, Review table 은 본인의 PK 가 있을 것이고, FK 로 Book의 PK 를 받을 것이다.

(PK - Primary Key - 기본키 / FK - Foreign Key - 참조키, 외래키)

Book table 과 Review table 이 있으면 관계를 지어줘야 한다. 그걸 DB Modeling 이라고 할 수 있는데, 여기서 Book 과 Review의 관계는 Book : Review = 1 : N 이다.

 

이것은 그림으로만 이해를 한 것이고, Jpa 는 @Entity 모델을 보고 DB를 이해하게 되는 것이니까,

다르게 말하면, @Entity 모델을 작성하는 것이 DB 모델링이라고 생각하면 되겠다.

 

일단은 Review 라는 클래스를 만들자. 그리고나서 1:N 의 관계를 어떻게 설정하느냐가 가장 중요한 부분이 될 것이다.

 

이제 1:N 의 관계를 맺고 있다는 걸, hibernate 가 알 수 있게 해줘야 한다.

그래야 hibernate가 1:N 의 관계를 맺어주는 것이다.

- 그럼 Review (자식) 의 입장에서는 Book (부모) 을 가리켜야 하기 때문에 Book 을 가리키는 column이 필요하다.

그런데, Review 에서 id, content, rating, createdAt 의 경우에는 object 의 관점에서 필요한 column 이라면,

Review에게 있어서 Book을 가리키는 정보는 database 의 관점에서 필요한 column 이 된다. 그러므로,

Book 을 가리키는 건, object에 만들어져야 하는 게 아니라 database table 에서 만들어져야 하는 것이다.

-- private Book book; -- Review 라는 객체 안에 Book 과의 관계 정보를 넣어야 한다. 

 

review 가 아직 없지만, DB 가 잘 만들어지는지 테스트만 해보도록 하겠다.

 

review table 은 없었기 때문에 만들어졌다.

book_id bigint not null 이라고 적혀있다. 이게 FK 가 만들어졌다는 걸 의미한다.

 

그 다음에 제약 조건, 관계 설정에 관한 쿼리가 있다. FK 가 만들어지는 쿼리.

alter table if exists review - review 라는 table 이 존재하면은,

add constraint   - 제약 조건을 거는 것.

FK70yr~~~ - 제약 조건의 이름, 이거는 그냥 임의로 만들어지는 것.

foreign key(book_id) - review 의 foreign key 는 book_id 가 된다는 의미

references book - 이 book_id 는 book 을 참조한다는 뜻. book 의 PK 인 book.id 를 참조한다는 뜻

이런 식으로 SQL 쿼리가 생성되기 때문에 서로 관계가 설정이 된다는 것을 내부적으로 이루어진다.
(@ManyToOne 을 보고 저렇게 된다는 것)

 

 

테이블 구조는 잘 만들어졌다.

 

아직 리뷰 정보를 입력하는 UI 가 없기 때문에,

InitDataConfig 에 리뷰 정보를 임의로 3개를 넣어보겠다.

ReviewService 를 만들지 않았으니 만들어보자.

그리고 아직 ReviewRepository도 만들지 않았으니 만들어보자.

자, 이제 다시 Service로 가보자.

 

이제, 다시 run 을 해보도록 하자.

그 전에, books.size() == 0 일때, 저게 실행되는걸로 했으니, 지금은 size()가 0 이 아니므로 그러면 review 정보 3개는 입력이 안 될 것이다. 그러므로, 그냥 이번에는 update - create 로 바꿔주자.

 

View Details 버튼을 누르는 건 다음 게시물에서.