Inversion of Control.
다른 객체를 직접 생성하거나 제어하는 것이 아닌 외부에서 관리하는 객체를 가져와 사용하는 것. 스프링은 스프링 컨테이너가 객체를 관리, 제공하는 역할을 함
Dependency Injection.
제어의 역전을 구현하기 위해 사용하는 방법. 어떤 클래스가 다른 클래스에 의존한다는 뜻.
객체 생성은 스프링 컨테이너가 생성하고 원하는 클래스에서 가져와 사용한다.
bean이 생성되고 소멸되기까지의 생명주기를 관리한다.
스프링에서 제공해주는 객체.
MyBean 이라는 클래스에 @Component 어노테이션 부착 시 MyBean 클래스는 빈으로 등록되고, 스프링 컨테이너에서 해당 클래스를 관리한다. 클래스 이름의 첫 글자를 소문자로 바꿔 관리한다(myBean)
Aspect Oriented Programming.
프로그래밍에 대한 관점을 핵심 관점, 부가 관점으로 나누어 관심 기준으로 모듈화 함.
Portable Service Abstraction.
스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스.
클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 어노테이 등
의존성 그룹. 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에서 제공하는 다양한 정보를 제공하기 쉽게 하는 의존성 모음)...
Gradle탭 내 Dependencies 항목의 complieClasspath 항목에서 확인 가능
스프링 부트는 애플리케이션이 최소한의 설정만으로도 실행되게끔 서버 시작 시 구성 파일을 읽어와서 자동으로 설정해주는 부분이 있다. 이 설정은 META-INF의 spring.factories 파일에 포함되어 있다.
//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
스프링 부트에서 자동 구성을 활성화하는 어노테이션.
등등
3계층 구조
given: 테스트 준비 단계
when: 테스트 진행 단계
then: 테스트 결과 검증 단계
spring-boot-starter-test 스타터 내의 테스트 도구들은
JUnit(자바용 단위 테스트 프레임워크), Spring Test&Spring Boot Test(스프링 부트 애플리케이션을 위한 통합 테스트 지원), AssertJ(검증문인 어설션을 작성하는 데 사용되는 라이브러리) 등등이 있다.
테스트 코드 예시
// 정상 코드
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
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 환경을 만들어 요청 및 전송, 응답 기능을 제공하는 유틸리티 클래스.