부트캠프에서 좀 타이트하게 수업들이 있어서 오늘 최대한 많이 들어놨습니다. 이에 관한 Java에서의 객체지향, 인터페이스, static..등등은 내일 적어보도록 하고 오늘은 남는 시간에 공부하며 개발중인 미니 게시판에서의 배움에 대해서 적어보겠습니다.
우선 크지 않은 볼륨의 게시판을 만들어보고 있기 때문에 사용기술도 무척 간단합니다.
Tech : Springboot, java 17, mysql, Jpa, swagger, thymeleaf, lombok
Table : User, Board, Comment(예정)
이정도 인 것 같습니다. 적고나니 정말 볼륨이 작아보이네요..!
Function :
우선 이정도로 생각을 하고 있고 카테고리나 댓글은 가능하다면 추가해보고 싶은 부분입니다. 추후에 테이블 구조를 좀 많이 바꿔야 할 수도 있을 것 같네요.
현재 프로젝트의 구조는

위 사진처럼 구성이 되어있습니다.
현재까지는 게시물 생성, 게시글 수정, 게시글 조회, 게시글 전체 조회(이는 추후 페이지네이션 offset 형식으로 반환 예정)까지 작성해놨습니다. 오늘은 Jpa의 Dirty-checking, Swagger 연동, 작성한 코드가 많지는 않지만 코드 리팩토링(컨트롤러 단에서 Entity사용을 하지 않기 위한 리팩토링)을 진행했습니다.
지금까지 작성했던 코드를 간단히 한번 보겠습니다.
우선 저는 컨트롤러단에서 Entity사용을 하지않고 Dto를 주사용하는 것을 고려하며 코드를 작성중입니다. 그 이유는 보안성 때문이라고 합니다. 물론 제가 현재 작성중인 코드는 Entity내에 민감한 정보가 들어있지는 않지만 만약 그렇다고 가정한다면 Entity를 그대로 컨트롤러단에서 사용하면 보안적으로 문제가 생길 수 있으며, Dto와 Entity의 목적에 맞게 분리해서 사용을 하기 위함입니다.
작성한 게시물 작성 코드를 한번 보겠습니다.

위 사진은 컨트롤러에서의 게시물 작성(저장) 코드입니다. @RequestBody로 데이터를 받아옵니다. 그리고 또 이를 BoardDto를 통해 데이터를 저장 후 위에서 의존성을 주입받은 boardService로 넘겨서 처리합니다. 서비스에서는 또 JpaRepository를 상속받은 repository를 통해서 실제 db를 처리합니다.
물론 나머지 기능들도 코드는 전부 다르지만 흐름은 위와 같습니다.
오늘 핵심적으로 알게 되었던 부분은 Jpa의 Dirty-checking과 스웨거입니다. 프론트 개발을 하며 스웨거를 통해 미리 테스트만 해봤었는데 제가 만들어서 올리니 참 느낌이 이상하네요.
아래 블로그를 참고해서 설정했습니다.
https://hogwart-scholars.tistory.com/entry/Spring-Boot-SpringDoc%EA%B3%BC-Swagger%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-API-%EB%AC%B8%EC%84%9C%ED%99%94-%EC%9E%90%EB%8F%99%ED%99%94%ED%95%98%EA%B8%B0
Dirty Checking이란 무엇인가?
JPA에서는 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 데이터베이스에 자동으로 반영해주는데 이를 Dirty Checking이라고 합니다.
한마디로 아래 사진과 같이 일부분을 수정해야 된다고 할 때 수정 후 저장을 하는 것이 아니라 자동으로 반영을 해준다는 것입니다.

Spring Data JPA에서는 @Transactional을 사용하여 더티 체킹을 수행할 수 있습니다.
JPA에서는 엔티티를 조회하면 해당 엔티티의 조회 상태 그대로 스냅샷을 만들어놓습니다.
그리고 트랜잭션이 끝나는 시점에는 이 스냅샷과 비교해서 다른점이 있다면 Update Query를 데이터베이스로 전달합니다.
이런 상태 변경 검사의 대상은 영속성 컨텍스트가 관리하는 엔티티에만적용 됩니다.
detach된 엔티티 (준영속)
DB에 반영되기 전 처음 생성된 엔티티 (비영속)
참고 : https://velog.io/@rivkode/Spring-Data-JPA-%EB%8D%94%ED%8B%B0-%EC%B2%B4%ED%82%B9Dirty-Checking