[Spring boot] 게시판 만들기 - 게시판 MVC 처리하기 (1)

2025. 3. 17. 16:30·Spring boot
반응형

 

"본 포스팅은 [원 블로그]의 내용을 참고하여 개인 학습 목적으로 작성되었습니다. 원 저작자의 권리를 존중하며,

내용 수정이나 삭제 요청이 있을 시 즉시 조치하겠습니다."

오늘은 

소프트웨어 디자인패턴인

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가 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로 매핑된 모습!

 

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
'Spring boot' 카테고리의 다른 글
  • [Spring boot] 게시판 만들기 - MVC 처리하기 (2)
  • [Spring boot] 게시판 만들기 - 게시판 CRUD 처리하기
  • [Spring boot] 게시판 만들기 - 게시판 데이터베이스(Maria DB) 연동하기
  • [Spring boot] 게시판 만들기 - 게시판 프로젝트 구조
20puddle
20puddle
20puddle 님의 블로그 입니다.
  • 20puddle
    20puddle 님의 블로그
    20puddle
  • 전체
    오늘
    어제
    • 분류 전체보기 (100)
      • Spring boot (5)
      • git & github (5)
      • algorithm (47)
        • theory (3)
        • 배열 (7)
        • 연결 리스트 (3)
        • 스택 (5)
        • 큐 (3)
        • 덱 (2)
        • 기초 코드 (19)
        • BFS (5)
      • AI (43)
        • Machine Learning (35)
        • Deep Learning (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    주성분변환
    연결리스트
    게시판
    딥러닝
    Java
    홀드아웃 검증
    백준
    Aimers
    그레디언트 클리핑
    github
    DL
    Spring Boot
    인공지능
    알고리즘
    git
    ML
    머신러닝
    오프라인 학습
    list
    AI
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.3
20puddle
[Spring boot] 게시판 만들기 - 게시판 MVC 처리하기 (1)
상단으로

티스토리툴바