Spring Boot 기초 학습하기

MONA·2024년 3월 4일

나혼공

목록 보기
11/92

Spring Boot 기본 개념

Spring Concept

IoC 제어의 역전

Inversion of Control.
다른 객체를 직접 생성하거나 제어하는 것이 아닌 외부에서 관리하는 객체를 가져와 사용하는 것. 스프링은 스프링 컨테이너가 객체를 관리, 제공하는 역할을 함

DI 의존성 주입

Dependency Injection.
제어의 역전을 구현하기 위해 사용하는 방법. 어떤 클래스가 다른 클래스에 의존한다는 뜻.

객체 생성은 스프링 컨테이너가 생성하고 원하는 클래스에서 가져와 사용한다.

Spring Container

Spring Container

bean이 생성되고 소멸되기까지의 생명주기를 관리한다.

Bean

스프링에서 제공해주는 객체.
MyBean 이라는 클래스에 @Component 어노테이션 부착 시 MyBean 클래스는 빈으로 등록되고, 스프링 컨테이너에서 해당 클래스를 관리한다. 클래스 이름의 첫 글자를 소문자로 바꿔 관리한다(myBean)

AOP 관점 지향 프로그래밍

Aspect Oriented Programming.
프로그래밍에 대한 관점을 핵심 관점, 부가 관점으로 나누어 관심 기준으로 모듈화 함.

PSA 이식 가능한 서비스 추상화

Portable Service Abstraction.
스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스.
클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 어노테이 등

Spring boot

Spring boot starter

의존성 그룹. spring-boot-starter-{작업유형} 명명규칙.
ex) spring-boot-starter-web(spring MVC를 사용해 RESTful 웹 서비스 개발 시 필요한 의존성 모음)
spring-boot-starter-test(spring application 테스트를 위한 의존성 모음),
spring-boot-starter-validation(유효성 검사를 위해 필요한 의존성 모음),
spring-boot-starter-acurator(모니터링을 위해 application에서 제공하는 다양한 정보를 제공하기 쉽게 하는 의존성 모음)...

Spring boot starter의 의존성

Gradle탭 내 Dependencies 항목의 complieClasspath 항목에서 확인 가능

자동 구성

스프링 부트는 애플리케이션이 최소한의 설정만으로도 실행되게끔 서버 시작 시 구성 파일을 읽어와서 자동으로 설정해주는 부분이 있다. 이 설정은 META-INF의 spring.factories 파일에 포함되어 있다.

Spring boot 코드 살펴보기

@SpringBootApplication

//SpringBootDeveloperApplication.java
@SpringBootApplication // 스프링 부트 사용에 필요한 기본 설정을 해줌
public class SpringApplication {

    public static void main(String[] args) {
        SpringApplication.run(StoreApplication.class, args);
        // SpringApplication.run : 애플리케이션 실행
        // 인수1 : application의 메인 클래스로 사용할 클래스
        // 인수2 : 커맨드 라인의 인수들
    }
}

@SpringBootApplication 어노테이션의 내부 어노테이션 @ComponentScan
사용자가 등록한 빈을 읽고 등록하는 어노테이션. @Component 어노테이션을 가진 클래스를 찾아 빈으로 등록한다.
빈에 등록하는 다른 어노테이션으로는
[@Configuration, @Repository, @Controller, @RestController, @Service]가 있다. 상황에 맞는 어노테이션을 이용한다.
+@RestController 어노테이션을 부착했을 때, 이 어노테이션이 @Component 어노테이션을 가지고 있기 때문에
@ComponentScan을 통해 빈으로 등록된다.

@EnableAutoConfiguration
스프링 부트에서 자동 구성을 활성화하는 어노테이션.

등등

Spring boot 구조

3계층 구조

  1. 프레젠테이션 계층
    HTTP 요청을 받고 요청을 비즈니스 계층으로 전송하는 역할. 여러 개의 컨트롤러가 이 역할을 함.
  2. 비즈니스 계층
    모든 비즈니스 로직 처리. 데이터 처리, 예외 처리, 프로세스 구현 로직 등. 서비스.
  3. 퍼시스턴스 계층
    모든 DB 관련 로직 처리. repository의 역할.

Test Code

Test Code 패턴- given-when-then

given: 테스트 준비 단계
when: 테스트 진행 단계
then: 테스트 결과 검증 단계

spring-boot-starter-test 스타터 내의 테스트 도구들은
JUnit(자바용 단위 테스트 프레임워크), Spring Test&Spring Boot Test(스프링 부트 애플리케이션을 위한 통합 테스트 지원), AssertJ(검증문인 어설션을 작성하는 데 사용되는 라이브러리) 등등이 있다.

JUnit

  • 자바용 단위 테스트 프레임워크.
  • 테스트 방식을 구분할 수 있는 어노테이션 제공.
  • @Test 어노테이션으로 메서드 호출시마다 새 인스턴스를 생성하고 독립적인 테스트가 가능하다.
  • 에상 결과를 검증하는 assertion 메서드를 제공한다.
  • 사용 방법이 단순하고 테스트 코드 작성 시간이 짧다.
  • 자동 실행, 자체 결과 체크 후 즉각적인 피드백을 제공한다.
  • 테스트 케이스가 하나라도 실패하면 전체 테스트를 실패한 것으로 보여준다. *단위테스트: 작성한 코드가 의도대로 작동하는지 작은 단위로 검증하는 것을 의미. 보통 메서드 단위.

테스트 코드 예시

// 정상 코드
public class JUnitTest{

    @Test
    public void junitTest(){
        int a = 1;
        int b = 2;
        int sum = 3;

        Assertions.assertEquals(sum, a+b);
    }
}

// 실패 코드
public class JUnitTest{

    @Test
    public void junitTest(){
        int a = 1;
        int b = 2;
        int sum = 4;

        Assertions.assertEquals(sum, a+b);
    }
}

package org.example.store;

import org.junit.jupiter.api.*;

public class JUnitTest {
    @BeforeAll // 전체 테스트 시작 전 1 회 실행. 전체 테스트 실행 주기에서 한 번만 호출되어야 하기 때문에 메서드는 static으로 선언
    static void beforeAll() {
        System.out.println("@BeforeAll");
    }

    @BeforeEach // TC 시작 전마다 실행. 각 인스턴스에 대해 메서드 호출해야 하기 때문에 static x
    public void beforeEach() {
        System.out.println(
                "@BeforeEach"
        );
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }

    @Test
    public void test2() {
        System.out.println("test2");
    }

    @Test
    public void test3() {
        System.out.println("test3");
    }

    @AfterAll // 전체 테스트 후 종료 전 1회 실행. static
    static void afterAll() {
        System.out.println("@AfterAll");
    }

    @AfterEach // TC 종료 전마다 실행. static x
    public void afterEach() {
        System.out.println("@AfterEach");
    }
}

결과

> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :compileTestJava
> Task :processTestResources NO-SOURCE
> Task :testClasses
@BeforeAll
@BeforeEach
test1
@AfterEach
@BeforeEach
test2
@AfterEach
@BeforeEach
test3
@AfterEach
@AfterAll
> Task :test

AssertJ 메서드

isEqualTo(A): A값과 같은지 검증
isNotEqualTo(A): A값과 다른지 검증
contains(A): A값을 포함하는지 검증
doesNotContain(A): A값을 포함하지 않는지 검증
startsWith(A): 접두사가 A인지 검증
endsWith(A): 접미사가 A인지 검증
isEmpty(): 빈 값인지 검증
isNotEmpty(): 비어있지 않은 값인지 검증
isPositive(): 양수인지 검증
isNegative(): 음수인지 검증
isGreaterThan(): 1보다 큰 값인지 검증
isLessThen(): 1보다 작은 값인지 검증

테스트코드 작성해보기

package com.example.validation.controller;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest // 테스트용 애플리케이션 컨텍스트 생성
@AutoConfigureMockMvc // MockMvc 생성 및 자동 구성
class UserApiControllerTest {

    @Autowired
    protected MockMvc mockMvc;

    @Autowired
    private WebApplicationContext context;

    @Autowired
    private MemberRepository memberRepository;

    @BeforeEach // 테스트 실행 전 실행하는 메서드
    public void mockMvcSetup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
    }

    @AfterEach // 테스트 실행 후 실행하는 메서드
    public void cleanUp(){
        memberRepository.deleteAll();
    }
}

@SpringBootTest
@SpringBootApplication이 있는 클래스를 찾고 클래스 내의 빈을 찾아 테스트용 애플리케이션 컨텍스트 생성.

@AutoConfigureMockMvc
MockMvc 생성 및 자동 구성. 컨트롤러 테스트용 클래스. 서버 배포 없이 테스트용 MVC 환경을 만들어 요청 및 전송, 응답 기능을 제공하는 유틸리티 클래스.

profile
고민고민고민

0개의 댓글