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 버튼을 누르는 건 다음 게시물에서.
'Spring Boot (+ RESTful)' 카테고리의 다른 글
Spring Boot - # Project 03 - Bootstrap / @PostMapping (2) | 2024.12.19 |
---|---|
Spring Boot - # Project 03 - 웹 버튼 클릭 / (1) | 2024.12.18 |
Spring Boot - Maven/Gradle을 사용한 종속성 관리 (1) | 2024.12.16 |
Spring Boot - 실습 - #Project 02 (Repository, Service, Controller, View 만들자) (0) | 2024.12.16 |
Spring Boot - application.properties / 실습 - #Project 02 (DB 연결, Entity 만들기) (2) | 2024.12.16 |