Inversion of Control
public class A{
b = new B();
}
위와 같은 코드는 b를 A에서 직접 생성한다.
제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아닌 외부에서 관리하는 객체를 가져와 사용하는 것을 말한다.
(1)
public class A{
private B b;
}
위와 같이 b를 직접 생성하지 않고 어디선가 받아온다.
Dependency Injection
IoC를 구현하기 위해 사용하는 방식이다.
public class A{
@Autowired
B b;
}
@Autowired
애너테이션은 스프링 컨테이너에서 빈을 주입한다.
객체의 주입과 관리는 스프링 컨테이너에 의해 이루어지고 컨테이너에서 객체를 관리하는 것은 생성, 소멸 등의 관리에 일관성을 준다.
기본적으로 controller, service, repository 로 다룬다.
순서대로 프레젠테이션 계층, 비즈니스 계층, 퍼시스턴스 계층 이라고도 말한다.
스프링 부트 스타터로 시작했을 때, 기본적으로 톰캣이 요청을 처리하는 듯 하다.
요청-응답 흐름
/test GET요청 -> 디스패처 서블릿이 URL분석 및 컨트롤러 매칭 -> 비즈니스, 퍼시스턴스 계층 지나면서 필요한 데이터 가져옴 -> 뷰 리졸버가 템플릿 엔진을 이용해 HTML문서, JSON, XML 등의 데이터를 생성 -> 응답
일단 응답까지 흐름에 디스패처 서블릿 , 뷰 리졸버 라는 구조가 있다는 걸 알아두자.
스프링 부트2는 자바8 이상을
스프링 부트3은 자바17 이상을 사용한다.
자바 17은 다음과 같은 텍스트 블록이 가능하다.
String query = "SELECT * FROM \"items\"\n" +
"WHERE \"status\" = \"ON_SALE\"\n";
String query17 = """
SELECT * FROM "items"
WHERE "status" = "ON_SALE"
""";
파싱을 위한 formatted()
도 제공한다.
String text17 = """
{
"id" : %d,
"name" : %s,
}
""".formatted(1, "choi");
record Item(String name, int price) {
// 파라미터가 private final로 자동 정의
}
Item a = new Item("car", 1000);
a.price(); //자동 getter
레코드는 상속할 수 없고 파라미터에 정의한 필드는 private final로 정의된다.
그리고 getter
를 자동으로 만들기 때문에 애너테이션이나 메서드로 getter
정의를 하지 않아도 된다.
if (o instanceof Integer){
Integer i = (integer) o;
}
if (o instanceof Integer){
//17버전 자동 형변환
}
자동으로 형변환이 진행된다.
java17로 지정한 내 intellij에선 err가 나더라 ( 일단 pass )