Service 계층에는 비즈니스 로직이 존재하고 트랜잭션(Transaction)을 시작한다. 이 계층은 데이터 접근 계층인 리포지토리를 호출하여 사용한다.
※트랜잭션이란?
- 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위를 뜻하며 상태를 변화 시킨다는 것은 질의어(SQL)를 이용하여 데이터베이스에 접근하는 것을 의미한다. 이 때 사용하는 질의어의 종류는 아래와 같다.
- SELECT
- INSERT
- DELETE
- UPDATE
@Service : 이 어노테이션 또한 @Repository와 마찬가지로 컴포넌트 스캔(component-scan)에 의해 스프링 빈으로 등록된다.
@Transactional : 스프링 프레임워크는 이 어노테이션이 붙어 있는 클래스나 메소드에 트랜잭션(Transaction)을 적용한다. 외부에서 이 클래스의 메소드를 호출할 때 트랜잭션을 시작하고 메소드를 종료할 때 트랜잭션을 커밋하며, 만약 예외가 발생하면 트랜잭션을 롤백한다. (롤백은 RuntimeException과 그 자식들인 Unchecked예외만 롤백하며, 기타 다른 예외에 롤백하고 싶다면 rollbackFor이라는 속성을 추가해주어야 한다.) 클래스에 이 어노테이션을 붙이면 클래스 내의 메소드에 전체 적용되며, 메소드에 읽기 전용 트랜잭션만 시키고 싶으면 메소드 별로 readOnly속성을 적용하여 true로 바꿔주면 된다.(default : false)
@RequiredArgsConstructor : Lombok 기능 중 하나. 생성자 주입을 임의의 코드없이 자동으로 설정해 주는 어노테이션이다.
이 어노테이션은 새로운 필드를 추가할 때 다시 생성자를 만들어서 관리해야하는 번거로움을 없애준다.
게시판 프로젝트에서 필요한 기본적인 기능은 게시물 저장, 조회(list), 상세 조회, 삭제이다. 서비스단을 만드려면 리포지토리가 필요하기에 리포지토리 의존성을 추가해 줬다. 이때 리포지토리 객체가 생성되어 서비스 필드에 주입되면 굳이 재할당될 필요없이 해당 리포지토리만 쓰면 되기에 final을 설정해 주었다.
게시판 저장 : 프론트단에서 작성을 하고 저장버튼을 누르면 작성한 게시물을 저장하기 위해 실행되는 메소드이다.
해당 메소드는 리포지토리의 save() 메소드를 사용하여 동작한다. 해당 메소드는 트랜잭션 실행 시 읽기뿐만 아니라 수정도 되어야 한다.
하지만 클래스 전체에 트랜잭션을 readOnly로 설정해 놓았기 때문에 매소드 @Transactional 어노테이션을 추가해주어야 한다.
게시판 조회 : 저장한 게시물을 게시물 리스트에 출력하기 위해 필요한 메소드이다.
리포지토리의 findAll() 메소드를 사용하여 동작하며, save() 메소드에 의해 저장된 데이터들을 전부 불러온다. @Transactional은 이미 클래스에서 선언되어 적용되어 있기 때문에 메소드에 적용시킬 필요가 없다.
게시판 상세 조회 : 게시판의 리스트에서 하나의 게시글을 타고 들어갔을 때 제목과 내용이 출력되도록 하기 위해 필요한 메소드이다.
이 메소드는 먼저 리포지토리의 findById() 메소드를 사용하여 게시물들이 저장될 때 부여된 id를 조회하며, 만약 id를 조회했을 때 찾아진 id가 없으면 예외처리되면서 "데이터가 없습니다."라는 메시지를 띄운다. 트랜잭셔널 어노테이션 또한 위에서 언급한 바와 같이 선언되어
있기 때문에 적용시킬 필요가 없다.
게시글 삭제 : 프론트단에서 삭제 버튼을 누르면 작성한 게시물을 삭제하기 위해 실행되는 메소드이다.
이 메소드는 리포지토리의 deleteById() 메소드를 사용하여 동작하며, 삭제하기 위한 게시글의 id를 조회해서 삭제를 진행한다. 이 메소드 또한 위에서 언급한 것과 같이 수정기능이 필요하기에 트랜잭셔널 어노테이션을 추가해 주어야 한다.
이렇게 게시판에 적용되는 CRUD 기능을 가진 서비스단을 완성하였다. 본래는 이러한 Repository와 Service를 가지고 TEST를 생성하여 해당 기능들이 정상적으로 동작하는지 확인을 하는 과정을 거쳐야 하지만 작은 프로젝트이기도 하고 직접 눈으로 보면서 문제점을 찾고 이해를 하고 싶어서 TEST를 생성하는 대신 template을 만들어 직접 실행하면서 프로젝트를 진행하기로 했다. 따라서 Controller를 만들기 전에 template을 먼저 제작하고 넘어갈 것이다. template에 대해 잠깐 언급하고 넘어가자면, template은 HTML 언어로 제작했으며 백엔드 서버에서 HTML을 동적으로 랜더링할 수 있도록 하기위해 Thymeleaf 템플릿 엔진을 사용하였다. template을 만드는 과정은 백엔드와 프론트엔드 구분을 위해 따로 개발기록을 작성하지는 않을 것이기에 다음 게시글은 Controller 제작과정이 되겠다.
'Spring MVC' 카테고리의 다른 글
Spring MVC)게시판 만들기 - 웹어플리케이션 실행 및 부족한 점 고찰 (0) | 2025.02.07 |
---|---|
Spring MVC)게시판 만들기 - Controller 생성 (1) | 2025.02.07 |
Spring MVC)게시판 만들기 - Repository 생성 (0) | 2025.02.05 |
Spring MVC)게시판 만들기 - Entity 생성 (0) | 2025.02.05 |
Spring MVC)게시판 만들기 - 프로젝트 환경 설정 (0) | 2025.02.04 |