스프링과 스프링부트란?

풀떼기·2023년 11월 6일

SpringBootLearn

목록 보기
2/8

스프링

  • IoC와 DI
    - IoC(Inversion of Control)
    제어의 역전. 다른 객체를 직접 생성하지 않고 외부에서 관리하는 객체를 가져온다.
    - DI(Dependency Injection)
    의존성 주입. 어떤 클래스가 다른 클래스에 의존한다.
    ❗스프링 컨테이너에서 객체를 주입받아 사용
  • SpringContainer와 Bean
    - SpringContainer
    빈이 생성되고 소멸되기까지의 생명주기를 관리하고 DI를 지원한다.
    - Bean
    스프링 컨테이너가 생성하고 관리하는 객체다.
    ❗스프링에서 제공해주는 객체
  • AOP(Aspect Oriented Programming)
    관점 지향 프로그래밍. 프로그래밍에 대한 관점을 핵심관점, 부가관점으로 나누어서 관심 기준으로 모듈화하는 것. 핵심관점 코드에만 집중이 가능하며 프로그램의 변경과 확장에 유용하게 대응이 가능해진다.
  • PSA(Portable Service Abstraction)
    이식 가능한 서비스 추상화. 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스.

스프링과 스프링부트

SpringBoot는 결국 Spring을 더욱 쉽고 빠르게 이용할 수 있도록 만든 도구다.
특징을 나열해보자면 다음과 같다.
1. WAS 내장
2. 단순화된 빌드 구성
3. XML 대신 Java 코드 사용
4. JAR을 사용한 배포 가능
5. Spring Actuator 제공


예제

@RestController
public class TestController {
    @GetMapping("/test")
    public String test() {
        return "Hello, world!";
    }
}
  • @RestController
    Restful Web Service에서 사용되는 컨트롤러 어노테이션
    @Controller + @ResponseBody가 합쳐진 형태로 json 형태의 객체 데이터를 반환
    (참고: https://backendcode.tistory.com/213)

스프링부트 스타터

의존성이 모여있는 그룹. spring-boot-starter-{작업유형}이라는 명명규칙이 존재한다.
web, test, validation, actuator, data-jpa와 같은 스타터가 자주 사용된다.
현재 예제 프로젝트에 적용된 스타터는 web, test 스타터이다.

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

자동 구성

스프링부트에서는 애플리케이션이 최소한의 설정만으로도 실행되게 여러 부분을 자동으로 구성한다.

프로젝트에 쓰일 구성 후보들


자바 버전

자바 17의 주요 변화

  • 텍스트 블록
    여러 줄의 텍스트를 작성하려면 \n을 추가해야 했지만 """로 감싼 텍스트로 표현 가능
String query17 = """
	SELECT * FROM "items"
    WHERE "status" = "ON_SALE"
    ORDER BY "price";
    """;
  • formatted() 메서드
    값을 파싱하기 위한 메서드
String textBlock17 = """
    {
        "id": %d,
        "name": %s
    }
    """.formatted(2, "juice");
  • 레코드
    데이터 전달을 목적으로 하는 객체를 더 빠르고 간편하게 만들기 위한 기능
    레코드는 상속을 할 수 없고 파라미터에 정의한 필드는 private final로 정의된다
    Getter를 자동으로 만들기 때문에 애너테이션이나 메서드로 게터 정의를 하지 않아도 된다
record Item(String name, int price) {
	// 파라미터가 private final로 정의된다.
}
Item juice = new Item("juice", 3000);
juice.price();	// 3000
  • 패턴 매칭
    타입 확인을 위해 사용하던 instanceof 키워드를 더 쉽게 사용할 수 있게 해준다
    바로 형변환을 한 다음 사용 가능
if (o instanceof Integer i) {
	...
}
  • 자료형에 맞는 case 처리
    switch-case문으로 자료형에 맞게 case 처리를 할 수 있다
static double get IntegerValue(Object o) {
	return switch (o) {
    	case Double d -> d.intValue();
        case Float f -> f.intValue();
        case String s -> Integer.parseInt(s);
        default -> 0d;
    };
}

오류

예제를 따라 진행하던 도중 DB관련 오류가 생겼다.
오류 로그를 확인해보니 다음 줄이 눈에 띄었다.

Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]

검색해보니 application.yml에 defer-datasource-initialization: true 코드를 추가하면 된다고 한다.
문제는 내 코드에는 이미 옵션이 포함되어 있었다!

잘 살펴보면 제법 멍청한 짓을 했음을 눈치챌 수 있다.
전송 쿼리 확인이라고 주석을 달아놓고 그 아래 행부터 TAB이 제대로 적용되어있지 않던 것...
다음과 같이 변경하니 오류가 바로 사라졌다. 제대로 확인하자.

profile
주니어 백엔드 개발자입니다.

0개의 댓글