[Spring Boot] aLog Project - 환경세팅

김광현·2023년 8월 30일
0

Project - aLog

목록 보기
1/12
post-thumbnail

Spring Boot를 이용해 구현하는 블로그 프로젝트입니다. 🏆


Spring Intitializr

Spring Boot 프로젝트를 받기 위해 Spring Initializr 에 접속하여 Spring Boot 버전과 필요한 의존성을 추가하고 GENERATE 버튼을 클릭 후 zip 파일을 다운로드합니다.

⚠️ Spring Boot 3.0 이후 버전부터는 JAVA 17부터 지원됩니다.

✅ 일반적으로 패키지명은 웹 사이트 주소의 역순으로 합니다.


✅ 추가 작성

plugins {
	id 'java'
	id 'eclipse'
	id 'org.springframework.boot' version '2.7.15'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'com'
version = '0.0.1'

java {
	sourceCompatibility = '11'
}

repositories {
	mavenCentral()
	jcenter()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'junit:junit:4.13.1'
}

tasks.named('test') {
	useJUnitPlatform()
}

jcenter 라이브러리 추가와 단위 테스팅을 위한 junit 라이브러리를 추가해줍니다.


Build and run usingRun tests using 값을 IntelliJ IDEA로 변경해줍니다.



HelloController.java

간단한 API를 생성합니다.

package com.aLog.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

📁 코드 설명

1. @RestController
	- 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어 줍니다.

2. @GetMapping
	- HTTP Method인 Get의 요청을 받을 수 있는 API를 만들어 줍니다.

HelloControllerTest.java

테스트 코드를 작성할 HelloControllerTest.java 클래스를 생성합니다.

package com.aLog.controller;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void hello가_리턴된다() throws Exception {
        String hello = "hello";

        mvc.perform(MockMvcRequestBuilders.get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }
}

📁 코드 설명

1. @RunWith(SpringRunner.class)
	- 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킵니다.
    - Spring Boot Test와 JUnit 사이의 연결자 역할을 합니다.
    
2. @@WebMvcTest(controllers = HelloController.class)
	- 여러 스프링 테스트 어노테이션 중, Web(Spring MVC)에 집중할 수 있는 어노테이션입니다.
    - 선언할 경우 @Controller, @ControllerAdvice 등을 사용할 수 있습니다.
    ⚠️ @Service, @Component, @Repository 등은 사용할 수 없습니다.
    
3. @Autowired
	- 스프링이 관리하는 빈(Bean)을 주입 받습니다.
    
4. private MockMvc mvc;
	- 웹 API를 테스트할 때 사용합니다.
    - HTTP GET, POST 등에 대한 API 테스트를 할 수 있습니다.
    
5.  mvc.perform(MockMvcRequestBuilders.get("/hello"))
	- MockMvc를 통해 /hello 주소로 HTTP GET 요청을 합니다.

6. .andExpect(status().isOk())
	- mvc.perform의 결과를 검증합니다.
    - HTTP Header의 Status를 검증합니다.
    - 200, 404, 500 등의 상태를 검증합니다.
    
7. .andExpect(content().string(hello));
	- mvc.perform의 결과를 검증합니다.
    - 응답 본문의 내용을 검증합니다.
    - Controller에서 "hello"를 리턴하기 때문에 이 값이 맞는지 검증합니다.


build.gradle

build.gradle에 lombok 의존성을 추가 작성합니다.

// lombok 의존성
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'


HelloResponseDto.java

HelloController.java 코드를 롬복으로 전환하는 과정입니다.
HelloResponseDto.java 코드를 작성합니다.

package com.aLog.dto;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class HelloResponseDto {

    private final String name;
    private final int amount;
}

📁 코드 설명

1. @Getter
	- 선언된 모든 필도의 get 메소드를 생성해줍니다.
    
2. @RequiredArgsConstructor
	- 선언된 모든 final 필드가 포함된 생성자를 생성해 줍니다.
    - final이 없는 필드는 생성자에 포함되지 않습니다.

HelloResponseDtoTest.java

Dto에 적용된 롬복이 잘 작동하는지 HelloResponseDtoTest.java 테스트 코드를 작성합니다.

package com.aLog.dto;

import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;

public class HelloResponseDtoTest {

    @Test
    public void 롬복_기능_테스트() {
        String name = "test";
        int amount = 1000;

        HelloResponseDto dto = new HelloResponseDto(name, amount);

        assertThat(dto.getName()).isEqualTo(name);
        assertThat(dto.getAmount()).isEqualTo(amount);
    }
}

📁 코드 설명

1. assertThat
	- assertj라는 테스트 검증 라이브러리의 검증 메소드입니다.
    - 검증하고 싶은 대상을 메소드 인자로 받습니다.
    - 메소드 체이닝이 지원되어 isEqualTo와 같이 메소드를 이어서 사용할 수 있습니다.
    
2. isEqualTo
	- assertj의 동등 비교 메소드입니다.
    - assertThat에 있는 값과 isEqualTo의 값을 비교해서 같을 때만 성공입니다.
    
✅ 롬복의 @Getter로 get 메소드가, @RequiredArgsConstructor로 생성자가 자동으로 생성됩니다.


HelloController.java

ResponseDto를 사용하도록 코드를 추가합니다.

@GetMapping("/hello/dto")
public HelloResponseDto helloDto(@RequestParam("name") String name, @RequestParam("amount") int amount) {
    return new HelloResponseDto(name, amount);
}

📁 코드 설명

1. @RequestParam
	- 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션입니다.
    - 여기서는 외부에서 name (@RequestParam("name")) 이란 이름으로 넘긴 파라미터를 메소드 파라미터 name(String name)에 저장하게 됩니다.

HelloControllerTest.java

추가된 API를 테스트하는 코드를 HelloControllerTest.java에 추가합니다.

package com.aLog.controller;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

import static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void hello가_리턴된다() throws Exception {
        String hello = "hello";

        mvc.perform(MockMvcRequestBuilders.get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }

    @Test
    public void helloDto_리턴된다() throws Exception {
        String name = "hello";
        int amount = 1000;

        mvc.perform(
                MockMvcRequestBuilders.get("/hello/dto")
                    .param("name", name)
                    .param("amount", String.valueOf(amount)))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name", is(name)))
                .andExpect(jsonPath("$.amount", is(amount)));
    }
}

📁 코드 설명

1. param
	- API 테스트할 때 사용될 요청 파라미터를 설정합니다.
    - 단, 값은 String만 허용됩니다.
    
2. jsonPath
	- JSON 응답값을 필드별로 검증할 수 있는 메소드입니다.
    - $를 기준으로 필드명을 명시합니다.

✔ 스프링 부트 환경에서 테스트 코드를 작성하는 방법과 롬복의 사용법에 대해 알아봤습니다.

aLog Project스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 이동욱 지음 도서를 참고해 작성한 글입니다.

profile
🅸nterest 🆂olving 🆃horough 🅹udgment

0개의 댓글