게시판 만들기 - 데이터베이스 접근 로직 구현

정영찬·2022년 8월 12일
0

프로젝트 실습

목록 보기
23/60

이전에는 erd 다이어그램을 통해 만들어진 도메인을 통해 엔티티를 생성하고, 리포지토리를 만들어서 테스트를 진행했다. 이제 본격적으로 데이터베이스 로직을 구현한다. 근데 데이터베이스 접근 로직 테스트 업무에서 JPA를 셋업하는 것으로 기능사용에 관련된 설정이 거의 끝났기 때문에 구현이라고 할만한 내용은 거의 마무리 되었다.

이번에는 이전에 JPA셋팅에서 더 발전시킬수 있는 부분이 있는지 살펴본다.

h2 console

어플리케이션을 실행하고 http:localhost:8080/h2-console로 들어가면 h2 콘솔창이 나타난다.(이전의 글에서는 h2.console.enable의 옵션을 false로 지정해놨는데, 그것을 true로 변경해줘야 실행될 것이다)

이상태로 연결을 시도하면 연결이 되지 않기 때문에 application.yaml에서 spring-datasource의 설정을 변경해준다. spring-datasource의 내용을 주석처리하고

이렇게 작성하고 다시 실행한 다음에 JDBC URL을 똑같이 작성하고 나서 연결을 하면...

연결 성공!

왼쪽에서 테이블을 클릭하면 SELECT 명령어로 자동지정되는데 여기서 run을 누르고 실행하면 테스트용으로 추가한 게시글들의 모습을 볼수 있다.

게시글의 댓글들 또한 같은 방식으로 볼수 있다.

h2 console을 통해서 테스트를 위해 추가한 게시글과 댓글을 확인하는 용도로 사용하고, 실질적으로는 MySQL을 사용할 것이다. 따라서 지금 까지 작성한 옵션의 내용을 제거하고 원래대로 돌려놓을 것이다. 물론 h2.console.enable의 옵션을 제거한뒤 저장한다.

application.yaml의 내용삭제 관련 커밋을 진행한다.

반복 코드 추출

Article 도메인에서 생성,수정자/날짜의 내용은 같은 부분이 많기 때문에 추출이 가능하다.

추출의 방식은 2가지로 진행된다. @MappedSuperclass @Embeddable
@MappedSuperclass로 정의하면 엔티티로 정의하는 것으로 다수의 엔티티에 공통적으로 적용해야할 때 사용가능하다.

@Embeddable은 value 타입으로 정의하는 것으로 비슷한 속성을 가지는 애트리뷰트를 하나의 값으로 만들어서 재사용성을 높일수 있는 방법이다.

@MappedSuperclass를 사용해서 반복코드를 추출한다.

domain 폴더 내부에 AuditingFields라는 클래스 파일을 생성한 다음 Article에 중복되는 필드를 옮긴다.

이제 auditing 필드가 뽑혀왔으니 auditing과 관련된 내용도 분리할 수 있다.
@EntityListeners(AuditingEntityListener.class)또한 AuditingFileds로 옮겨준다.

Tostring 과 Getter도 적용시키고, 추가적으로 해당 필드들이 실제 웹화면에서 보여줄때, 웹화면에서 파라미터를 받아서 세팅할 때는 파싱이 잘 되어있어야한다. 따라서 파싱에 관련된 룰을 추가해주는 것이 좋다. @DateTimeFormat이 그중 하나이다.

생성일시와 생성자는 게시글이 만들어지는 순간에 기록되는 데이터이기 때문에 변경되면 안되므로
@Column 어노테이션에서 updatable = false라는 옵션을 추가한다.

이제 @MappedSuperclass로 따로 빼놓은 필드들을 도메인들과 연결시켜야 하는데, 상속을 통해서 연결을 해준다.

public class Article extends AuditingFields

이런식으로 작성을 해주면 AuditingFiledsArticle의 일부분이 된다. 임베디드 방식과 다른 점이 있다면, 이 경우는 상속을 통해 일부의 내용이 상속대상으로 들어가는 것이고, 임베디드 방식은 필드가 하나 따로 추가되여 AuditingFields라는 필드가 생성되는 것이다.

ArticleComment도메인도 같은 작업을 통해 같은 내용을 추출한다.

이제 저장하고 깃크라켄에서 변동된 내용들을 커밋한뒤 push를 했다.

데이터베이스 로직 구현 완료!

profile
개발자 꿈나무

0개의 댓글