TIL spring(0415)

UihyunLee·2025년 4월 15일

부트캠프에서 좀 타이트하게 수업들이 있어서 오늘 최대한 많이 들어놨습니다. 이에 관한 Java에서의 객체지향, 인터페이스, static..등등은 내일 적어보도록 하고 오늘은 남는 시간에 공부하며 개발중인 미니 게시판에서의 배움에 대해서 적어보겠습니다.

우선 크지 않은 볼륨의 게시판을 만들어보고 있기 때문에 사용기술도 무척 간단합니다.
Tech : Springboot, java 17, mysql, Jpa, swagger, thymeleaf, lombok

Table : User, Board, Comment(예정)

이정도 인 것 같습니다. 적고나니 정말 볼륨이 작아보이네요..!
Function :

  • 보드 작성하기
  • 보드 하나 내용보기
  • 보드 리스트 보기
  • 보드 삭제하기
  • 보드 수정하기
  • 회원가입하기
  • 로그인하기
  • 회원탈퇴하기
  • 댓글달기(예정)

우선 이정도로 생각을 하고 있고 카테고리나 댓글은 가능하다면 추가해보고 싶은 부분입니다. 추후에 테이블 구조를 좀 많이 바꿔야 할 수도 있을 것 같네요.

현재 프로젝트의 구조는

위 사진처럼 구성이 되어있습니다.

  • config - 전체적인 설정 class 패키지
  • controller - restController, controller 패키지 (물론 thymeleaf를 사용중이기에 controller밖에 없습니다. 제가 React로 FrontEnd를 구성해서 JSON만 반환하는 restController로 깔끔하게 JSON 데이터만 넘기는 식으로 만들고 싶긴 하지만 thymeleaf를 사용해보고 싶은 마음이 있습니다.)
  • dto DTO는 Data Transfer Object의 약자로 레이어간 교환하는 데이터들의 패키지입니다.
  • entity 테이블과 일대일로 매팅되며 해당 클래스들의 패키지입니다.(Jpa에서 사용)
  • repository Jpa를 직접 사용하는 패키지입니다.
  • service 서비스 계층에는 비즈니스 로직이 있고 트랜잭션을 시작합니다. 서비스 레이어에서는 도메인 모델을 활용해 애플리케이션에서 제공하는 핵심 기능을 제공합니다.
    (추상화를 하는 형식을 많이 사용하는데 음 꼭 필요한지 내일은 꼭 찾아보는걸로)

현재까지는 게시물 생성, 게시글 수정, 게시글 조회, 게시글 전체 조회(이는 추후 페이지네이션 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

profile
공부 기록

0개의 댓글