스프링 부트 백엔드 개발 강좌, 블로그 화면 구성 예제, 뷰 테스트하기

소개

스프링 부트(Spring Boot)는 스프링 프레임워크를 기반으로 한 경량 애플리케이션 프레임워크입니다. 스프링 부트를 사용하면 복잡한 설정 없이 빠르게 애플리케이션을 시작하고 실행할 수 있습니다. 이 강좌에서는 스프링 부트를 사용한 백엔드 개발에 대해 알아보고, 블로그 화면 구성의 예제를 통해 실제 애플리케이션을 만드는 방법과 뷰 테스트 방법을 다룹니다.

1. 개발 환경 구축

스프링 부트 프로젝트를 시작하기 위해서는 다음과 같은 도구들이 필요합니다:

  • Java Development Kit (JDK): JDK 8 이상을 사용해야 합니다.
  • IDE: IntelliJ IDEA, Eclipse 또는 VSCode와 같은 통합 개발 환경.
  • Build Tool: Maven 또는 Gradle을 사용할 수 있습니다.

1.1. Spring Initializr를 통한 프로젝트 생성

많은 시간과 노력을 절약하기 위해 Spring Initializr를 사용하여 프로젝트를 생성할 수 있습니다. 다음은 프로젝트 생성을 위한 기본 단계입니다:

  1. 웹사이트를 방문합니다.
  2. 프로젝트 메타데이터를 입력합니다 (Group, Artifact 등).
  3. 필요한 의존성(Starter)을 선택합니다: Spring Web, Spring Data JPA, Spring Boot DevTools 등을 추천합니다.
  4. “Generate” 버튼을 클릭하여 ZIP 파일을 다운로드합니다.
  5. 다운로드한 파일을 압축 해제하고 IDE로 가져옵니다.

2. 프로젝트 구조 이해하기

생성된 프로젝트의 기본 구조를 살펴보겠습니다:

    └── src
        ├── main
        │   ├── java
        │   │   └── com
        │   │       └── example
        │   │           └── demo
        │   │               ├── DemoApplication.java
        │   │               ├── model
        │   │               ├── repository
        │   │               ├── service
        │   │               └── controller
        │   └── resources
        │       ├── application.properties
        │       └── static
        │       └── templates
        └── test
    

2.1. 각 디렉토리의 역할

각 디렉토리는 특정한 목적을 가지고 있습니다:

  • model: 애플리케이션의 데이터 모델을 정의합니다.
  • repository: 데이터베이스와의 상호작용을 위한 인터페이스를 포함합니다.
  • service: 비즈니스 로직을 처리합니다.
  • controller: HTTP 요청을 처리하고 응답을 전송합니다.

3. 블로그 화면 구성 예제

이제 간단한 블로그 애플리케이션의 화면을 구성해 보겠습니다. 아래는 블로그 포스트 목록을 표현하기 위한 컨트롤러와 HTML 뷰의 예시입니다.

3.1. 블로그 포스트 모델 생성

    package com.example.demo.model;

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;

    @Entity
    public class Post {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String title;
        private String content;

        // getters and setters
    }
    

3.2. 블로그 리포지토리 생성

    package com.example.demo.repository;

    import com.example.demo.model.Post;
    import org.springframework.data.jpa.repository.JpaRepository;

    public interface PostRepository extends JpaRepository {}
    

3.3. 블로그 서비스 생성

    package com.example.demo.service;

    import com.example.demo.model.Post;
    import com.example.demo.repository.PostRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;

    import java.util.List;

    @Service
    public class PostService {
        @Autowired
        private PostRepository postRepository;

        public List findAll() {
            return postRepository.findAll();
        }
        
        public Post save(Post post) {
            return postRepository.save(post);
        }
    }
    

3.4. 블로그 컨트롤러 생성

    package com.example.demo.controller;

    import com.example.demo.model.Post;
    import com.example.demo.service.PostService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;

    import java.util.List;

    @Controller
    @RequestMapping("/posts")
    public class PostController {
        @Autowired
        private PostService postService;

        @GetMapping
        public String list(Model model) {
            List posts = postService.findAll();
            model.addAttribute("posts", posts);
            return "posts/list";
        }

        @PostMapping
        public String create(Post post) {
            postService.save(post);
            return "redirect:/posts";
        }
    }
    

3.5. HTML 뷰 생성

이제 HTML 뷰를 생성해 보겠습니다. 아래는 Thymeleaf를 사용한 블로그 포스트 목록 뷰의 예시입니다:

    
    
        블로그 포스트 목록
    
    
        

블로그 포스트 목록

제목 내용

4. 뷰 테스트하기

애플리케이션이 정상적으로 동작하는지 확인하기 위해 뷰 테스트를 수행해야 합니다. 스프링 부트에서는 통합 테스트를 간편하게 수행할 수 있도록 다양한 도구를 제공합니다.

4.1. 테스트 환경 설정

먼저, spring-boot-starter-test 의존성이 포함되어 있어야 합니다. pom.xml 파일에 다음과 같이 추가합니다:

    
        org.springframework.boot
        spring-boot-starter-test
        test
    
    

4.2. 통합 테스트 생성

다음으로, 컨트롤러에 대한 테스트 클래스를 생성해 보겠습니다:

    package com.example.demo;

    import com.example.demo.model.Post;
    import com.example.demo.repository.PostRepository;
    import com.example.demo.service.PostService;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
    import org.springframework.boot.test.mock.mockito.MockBean;
    import org.springframework.test.web.servlet.MockMvc;

    import java.util.Arrays;
    import java.util.List;

    import static org.mockito.ArgumentMatchers.any;
    import static org.mockito.Mockito.when;
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;

    @WebMvcTest(PostController.class)
    public class PostControllerTest {
        @Autowired
        private MockMvc mockMvc;

        @MockBean
        private PostService postService;

        @BeforeEach
        public void setup() {
            List posts = Arrays.asList(
                new Post(1L, "첫 번째 포스트", "내용 1"),
                new Post(2L, "두 번째 포스트", "내용 2")
            );

            when(postService.findAll()).thenReturn(posts);
        }

        @Test
        public void testList() throws Exception {
            mockMvc.perform(get("/posts"))
                .andExpect(status().isOk())
                .andExpect(view().name("posts/list"))
                .andExpect(model().attributeExists("posts"));
        }

        @Test
        public void testCreate() throws Exception {
            mockMvc.perform(post("/posts")
                .param("title", "새로운 포스트")
                .param("content", "내용"))
                .andExpect(status().is3xxRedirection())
                .andExpect(redirectedUrl("/posts"));
        }
    }
    

4.3. 테스트 실행

위의 테스트를 실행하면 블로그 포스트 목록과 새 포스트 생성 기능이 정상적으로 작동하는지 확인할 수 있습니다.

결론

이번 강좌에서는 스프링 부트를 사용하여 블로그 애플리케이션의 백엔드 개발을 진행하고, 실제 애플리케이션을 구성하기 위한 모델, 리포지토리, 서비스, 컨트롤러, HTML 뷰를 다뤘습니다. 또한, 작성한 뷰를 테스트하는 방법까지 알아보았습니다. 이 강좌를 통해 스프링 부트로 강력한 웹 애플리케이션을 구축하는 데 필요한 기초 지식을 쌓을 수 있기를 바랍니다.

참고자료