Group Study (2021-2022)/Spring Boot

[Spring Boot] 1주차 스터디 - 스프링 부트 시작 / 테스트 코드 작성

whaeun 2021. 10. 4. 00:56

[ 스터디 목표 ]

  • 스프링과 웹 프로젝트에 대한 전반적인 이해를 높일 수 있다.
  • 인텔리제이로 스프링 부트를 시작할 수 있다.
  • 스프링 부트에서 테스트 코드를 작성할 수 있다.

 

[ 스터디 범위 ]

  • 스프링과 웹 프로젝트 전반에 대한 이해
REST API가 뭔가요? - https://www.youtube.com/watch?v=iOueE9AXDQQ&t=42s
MVC 웹 프레임워크가 뭔가요? - https://www.youtube.com/watch?v=AERY1ZGoYc8
웹 서비스의 동작 원리 - https://www.youtube.com/watch?v=-B60B9eAIyU
뷰 템플릿과 MVC 패턴 - https://www.youtube.com/watch?v=Y_gkH0nLMY8
MVC의 역할과 실행 흐름 - https://www.youtube.com/watch?v=5vfxeRJJsWo
  • [01장] 인텔리제이로 스프링부트 시작하기
  • [02장] 스프링부트에서 테스트 코드를 작성하자

 

[ 스터디 내용 ]

❄️ [00장] 스프링과 웹 프로젝트 전반에 대한 이해 

  • REST API가 뭔가요?
    • REST API: http 요청을 보낼 , 어떤 uri 어떤 메소드를 사용할지에 대해 개발자들 사이에 지켜지는 약속
    • REST API에서 사용되는 방식

         1. GET – 데이터를 조회하는데 사용
         2. POST – 새로운 정보를 추가하는데 사용
         3. DELETE – 데이터를 삭제할 경우 사용
         4. PUT – 데이터를 변경하는데 사용 (정보를 통째로 변경할 때 사용)
         5. PATCH – 데이터를 변경하는데 사용 (정보 중 일부를 특정 방식으로 변경할 때 사용)

 

  • MVC 웹 프레임워크가 뭔가요?
    • MVC 웹 프레임워크: 소프트웨어를 Model, View, Controller로 분리해서 접근할 수 있는 MVC 구조의 기본 설계가 갖춰진 상태의 코드

         - Model: ‘데이터’와 관련된 것 - 데이터의 형식을 저장하고 불러오는 작업들에 대한 코드
         - View: 눈에 보이는 것
         - Controller: 제어하는 것

    • '프레임워크' V.S. '라이브러리'

         - 프레임워크: 복잡한 문제를 해결하거나 서술하는 데 사용되는 기본 개념 구조
         - 라이브러리: 소프트웨어를 개발할 때 컴퓨터 프로그램이 사용하는 비휘발성 자원의 모임

 

  • 웹 서비스의 동작 원리
    • 웹서비스는 클라이언트 서버의 요청과 응답으로 동작함.

         - 클라이언트: 서비스를 사용하는 프로그램/ 컴퓨터
         - 서버: 서비스를 제공하는 프로그램/컴퓨터

    • localhost:8080

         - 의미: 주소/포트 번호
         - localhost: 서버의 주소, "내 컴퓨터"라는 주소
         - 8080: 포트 번호, "8080방"에 비유됨

 

  • 뷰 템플릿과 MVC 패턴
    • 뷰 템플릿 (View Templates): 화면을 담당하는 기술 
    • 뷰템플릿에는 Controller(처리과정을 담당)와 Model(데이터와 관련) 두 종류가 있다.
    • MVC 패턴: 화면 처리 데이터 분야를 각 담당자 별로 나눈 기법

 

  • MVC의 역할과 실행 흐름
    • spring boot는 서버의 역할을 수행하며 Controller + Model + View의 유기적 역할 분담이 존재함.
    • MVC의 실행 흐름:
Controller는 client로부터 요청을 받음  ➡️  View는 최종 페이지를 만들어줌  ➡️  Model은 최종 페이지에 쓰일 데이터들을 View에 전달

 

 

❄️ [01장] 인텔리제이로 스프링부트 시작하기

  • 인텔리제이 설치하기
  • 그레이들 프로젝트를 스프링 부트 프로젝트로 변경하기
    • build.gradle 전체 코드

               : 스프링 이니셜라이저(https://start.spring.io/)를 통해 설정 가능

buildscript{

//ext: 전역 변수를 설정할 것임을 나타내는 키워드
    ext{
        springBootVersion = '2.1.9.RELEASE'
    }

//repositories: 각종 의존성(라이브러리)들을 어떤 원격 저장소에서 받을지 결정
    repositories{
        mavenCentral()
        jcenter()
    }
//dependencies: 프로그램에 필요한 의존성들을 선언하는 곳
    dependencies{
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}


apply plugin:'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
//스프링 부트의 의존성을 관리해 주는 플러그인
apply plugin: 'io.spring.dependency-management'


group 'com.whaeun'
version '1.0-SNAPSHOT'


sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {

    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.projectlombok:lombok')

    testCompile('org.springframework.boot:spring-boot-starter-test')
}
  • .gitignore 파일 사용하기
    • .gitignore : 깃에서 특정 파일 혹은 디렉토리를 관리 대상에서 제외할 때 사용
.gradle
.idea

 

 

❄️ [02장] 스프링부트에서 테스트 코드를 작성하자

  • 테스트 코드 작성하기
    • TDD: 테스트가 주도하는 개발을 이야기, 테스트 코드를 먼저 작성하는 것부터 시작
    • 단위 테스트: 기능 단위의 테스트 코드를 작성하는 것
    • 테스트 코드의 필요성

         1. 요청 결과가 다를 경우 프로그램을 중지하고 코드를 수정하는 방식으로 개발이 이루어져 빠른 피드백이 가능함.
         2. 테스트 코드를 통한 자동 검증이 가능함.
         3. 개발자가 만든 기능을 안전하게 보호해 줌. 

    • HelloControllerTest
package com.whaeun.springboot.web;

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 static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import org.springframework.test.web.servlet.ResultActions;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

//스프링 부트 테스트와 JUnit 사이에 연결자 역할을 함.
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {
	//스프링이 관리하는 빈을 주입 받음
    @Autowired
    //웹 MVC 테스트의 시작점
    private MockMvc mvc;

    @Test
    public void hello가_리턴된다() throws Exception{
        String hello = "hello";
		
        //MockMvc를 통해 /hello 주소로 HTTP GET 요청을 함.
        //mvc.perform의 결과를 검증함.
        //Http Header의 Status를 검증함.
        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));

    }

}
  • 롬복(Lombok) 라이브러리 사용하기
    • 롬복은 자바 개발 시 자주 사용하는 코드인 Getter, Setter, 기본 생성자, toString 등을 어노테이션을 자동으로 생성해 줌.
    • 어노테이션: 코드 사이에 주석처럼 사용되어 특별한 의미, 기능을 수행하도록 하는 기술

      - @Getter : 선언된 모든 필드의 get 메소드를 생성해 줌.
      - @RequiredArgsConstructor : 선언된 모든 final 필드가 포함된 생성자를 생성해 줌.
      - @RequestParam : 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션

 

[트러블 슈팅 ]

  • gradle의 버전이 맞지 않아 버전 다운 그레이드를 해주었다.
    • terminal에서 다운 그레이드 시행
         ./gradlew wrapper --gradle-version 4.10.2 
    • gradle/wrapper/gradle-wrapper.properties에서 distributionUrl의 값 설정
        https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip
  • java compile 에러가 발생해 JDK 1.8을 다운로드하고 이에 대하여 환경 변수 설정을 해주었다. (Mac m1 환경)
        brew tap AdoptOpenJDK/openjdk
        brew install --cask adoptopenjdk8
        /usr/libexec/java_home -v 1.8
        java -version

 

[ 참조 링크 ]