"본 포스팅은 [원 블로그]의 내용을 참고하여 개인 학습 목적으로 작성되었습니다. 원 저작자의 권리를 존중하며,
내용 수정이나 삭제 요청이 있을 시 즉시 조치하겠습니다."
오늘은
소프트웨어 디자인패턴인
MVC를 진행해보겠습니다

● MVC란?
○ M(model) V(view) C(controller)라고 불리는 MVC는 디자인 패턴 중 하나입니다
여기서 디자인 패턴이란 프로그램이나 어떤 특정한 것을 개발하는 중에 발생했던 문제점들을
정리해서 상황에 따라 간편하게 적용해서 쓸 수 있는 것을 정리하여 특정한 "규약"을 통해
쉽게 쓸 수 있는 형태로 만든 것을 말합니다.그렇다면 MVC는 하나의 애플리케이션,
프로젝트를 구성할 때 그 구성요소를 세가지의 역할로 구분한 패턴입니다.

1. 서비스 클래스 생성하기
우선 서비스 영역에 대해 다룰 건데 M(model)에 해당합니다
클라이언트의 요청사항을 처리하는 비지니스 로직을 실행하는 영역입니다
src/main/java/com/study/domain/post 디렉토리에 PostService라는 클래스를 생성 후 다음의 코드를 작성합니다.
package com.study.domain.post;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@RequiredArgsConstructor
public class PostService {
private final PostMapper postMapper;
/**
* 게시글 저장
* @param params - 게시글 정보
* @return Generated PK
*/
@Transactional
public Long savePost(final PostRequest params) {
postMapper.save(params);
return params.getId();
}
/**
* 게시글 상세정보 조회
* @param id - PK
* @return 게시글 상세정보
*/
public PostResponse findPostById(final Long id) {
return postMapper.findById(id);
}
/**
* 게시글 수정
* @param params - 게시글 정보
* @return PK
*/
@Transactional
public Long updatePost(final PostRequest params) {
postMapper.update(params);
return params.getId();
}
/**
* 게시글 삭제
* @param id - PK
* @return PK
*/
public Long deletePost(final Long id) {
postMapper.deleteById(id);
return id;
}
/**
* 게시글 리스트 조회
* @return 게시글 리스트
*/
public List<PostResponse> findAllPost() {
return postMapper.findAll();
}
}
| @Service | 해당 클래스가 비지니스 로직을 처리하는 Service 클래스임을 명시하는 어노테이션 |
| @RequiredArgsConstructor | final로 생성된 필드를 대상으로 생성자를 자동으로 만들어 생성자 주입을 깔끔하게 처리하게 도와주는 어노테이션 |
| @Transactional | 트랜잭션 처리란 여러 개의 쿼리를 하나의 connection으로 묶어서 관리하는 것으로 모든 작업이 성공적으로 완료되면 통과(Commit),하나라도 실패하면 전체 작업을 취소(Rollback)합니다.메서드에 이 어노테이션이 있으면 매서드의 정상 종료 여부에 따라 commit 또는 rollback 합니다. |
서비스 영역 테스트 해보기
방금 작성한 서비스 클래스의 일부를 테스트 해보겠습니다
src/test/java 디렉터리 위치에 PostServerTest라는 클래스를 생성 후 다음의 코드를 작성합니다
package com.study;
import com.study.domain.post.PostRequest;
import com.study.domain.post.PostService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class PostServiceTest {
@Autowired
PostService postService;
@Test
void save() {
PostRequest params = new PostRequest();
params.setTitle("1번 게시글 제목");
params.setContent("1번 게시글 내용");
params.setWriter("테스터");
params.setNoticeYn(false);
Long id = postService.savePost(params);
System.out.println("생성된 게시글 ID : " + id);
}
}
저는 이 코드를 보면서 한가지 궁금증이 생겼습니다
@Autowired와 @RequiredArgsControctor의 차이점은 무엇일까?
우선 생성자를 자동으로 만들어서 객체를 클래스에 주입한다는 공통점이 있습니다
차이점은 여러가지가 있었는데
현재 저의 지식으로는 이해하기 힘든 부분이 있어 간략히 요약하자면
둘 다 스프링 컨테이너에 등록된 Bean을 어떻게 처리하느냐의 주입 방식에서 차이가 있는데
@RequiredArgsConstructor는 final 또는 @Nonnull이 붙은 필드들의 생성자를 자동생성해주고
@Autowired는 키워드 필요없이 어떤 필드든 생성자를 만들어준다
@RequiredArgsConstructor는 해당 클래스에 @RequiredArgsConstructor + private final 필드로 충분하지만
@Autowired는 주입받고자 하는 필드에 @Autowired 각각 붙여줘야 해서 가독성 측면에서 차이가 있다.
테스트 코드의 save() 메서드를 실행해보면

ID가 null로 나오는 것을 확인할 수 있다.
이유는 id(PK) 값이 자바 객체에 반영되지 않아 여전히 null로 남아있기 때문이다.
여기서 PK는 Primary Key로써 자동으로 1씩 증가되는 특징이 있어
DB 테이블에서 각 행을 식별 가능하게 하는 역할입니다.
이 문제를 해결하기 위해 useGeneratedKeys옵션을 사용해야합니다
postMapper.xml 파일에 게시글 저장 부분에서
<insert id="save" parameterType="com.study.domain.post.PostRequest" useGeneratedKeys="true" keyProperty="id">
위와 같이 코드를 수정합니다.
useGeneratedKeys="true" - > DB에서 생성된 키를 가져오겠다!
keyProperty="id" - > 가져온 키를 자바 객체에 반영해줘!
이런 느낌입니다.
수정 후 다시 실행해보면

PK로 매핑된 모습을 확인할 수 있다!
사진은 한 번 실행할 때마다 1씩 늘어나 8이 된 모습이다.
즉 8번 실행시켰다는 말이다.
마무리
- 현재 MVC 중 M밖에 하지 않았지만 사이사이에 다룬 내용들이 많고 뒤의 내용도 꽤 길어 포스팅이 길어질 것 같아
두 번에 나눠서 작성하겠습니다! 새로운 것들을 배우면서 이전에 배우던 것들과 어떤 관계고 어느 부분에서
쓰이는 지 궁금증이 생기고 공부해보며 이해도를 높이려고 노력했습니다.뒤이어 나올 내용은 html,css 같이
프론트엔드 영역을 다룰 예정이여서 이해하기 쉽게 하고자 나눈 것도 있습니다
'Spring boot' 카테고리의 다른 글
| [Spring boot] 게시판 만들기 - MVC 처리하기 (2) (0) | 2025.03.21 |
|---|---|
| [Spring boot] 게시판 만들기 - 게시판 CRUD 처리하기 (0) | 2025.03.10 |
| [Spring boot] 게시판 만들기 - 게시판 데이터베이스(Maria DB) 연동하기 (0) | 2025.03.04 |
| [Spring boot] 게시판 만들기 - 게시판 프로젝트 구조 (0) | 2025.03.01 |