본문 바로가기
도서/프로그래밍

스프링 부트 3 백엔드 개발자 되기 (1) 스프링 콘셉트 공부하기

by 신발사야지 2023. 5. 21.

스프링 콘셉트 공부하기

 

2.2.1 제어의 역전과 의존성 주입

 

IoC(Inversion of Control)란?

// 일반적인 코드
public class A {
	private B b = new B();
}

// IoC , 코드에서 객체를 생성하지 않음, 어디선가 받아온 객체를 b에 할당
public class IoC {
	private B b;
	IoC(IB b) {
		this.b = b;
  }
}

 

DI(Dependency Injection)란?

스프링은 객체들을 관리하기 위해 제어의 역전(IoC)를 사용합니다.

그리고 IoC를 구현하기 위해 사용하는 방법이 의존성 주입(DI) 입니다.

// 의존성 주입
public class A {
	@Autowired
	B b; // 스프링 컨테이너가 DI(만들어서 넣어줌) 해줌
}

 

AOP(Aspect Oriented Programming)

직역하면 관점 지향 프로그래밍

프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화 하는 것을 의미합니다.

핵심기능1 + 로깅, 핵심기능2 + 로깅 이렇게 나누어서, 로깅을 모듈화 하는 것을 뜻합니다.

프로그래머가 핵심 관점 코드에만 집중할 수 있게 되고, 프로그램의 변경과 확장에도 유연하게 대응할 수 있어서 좋습니다.

 

PSA (Portable Service Abstraction)

이식 가능한 서비스 추상화

스프링에서 데이터 베이스에 접근하기 위한 기술로는 JPA, MyBatis, JDBC 같은 것들이 있는데요.

어떤 기술을 사용하든 일관된 방식으로 데이터베이스에 접근하도록 인터페이스를 지원합니다.

WAS 도 PSA 의 예시 중 하나라고 볼 수 있는데요. 코드는 그대로 두고 WAS를 톰캣이 아닌 언더토우, 네티와 같은 다른 곳에서 실행해도 기존 코드를 그대로 사용할 수 있으니까요.

 

정리

스프링 프레임워크는 Ioc/DI를 통해 객체 간의 의존관계를 설정하고, AOP를 통해 핵심 관점과 부가 로직을 분리해 개발하며, PSA를 통해 추상화된 다양한 서비스들을 일관된 방식으로 사용하도록 합니다.

 

2.3.4 스프링 부트 3와 자바 버전

스프링 부트 3 부터는 자바 17 버전 이상을 사용해야 합니다.

자바 17의 주요 변화는 다음과 같습니다.

 

텍스트 블록

String query17 = """
	SELECT * FROM "items"
	WHERE "status" = "ON_SALE"
	ORDER BY "price";
""";

 

formatted() 메서드

String textBlock17 = """
{
	"id": %d,
	"name": %s,
}
""".formatted(2, "juice");

 

레코드

레코드는 데이터 전달을 목적으로 하는 객체를 더 빠르고 간편하게 만들기 위한 기능입니다.

레코드는 상속할 수 없고 파라미터에 정의한 필드는 private final 로 정의 됩니다. 또한 레코드는 게터를 자동으로 만들기 때문에 애너테이션이나 메서드로 게터 정의를 하지 않아도 됩니다.

record Item(String name, int price) {
	// 파라미터가 자동으로 private final로 정의 됨
}

Item juice = new Item("juice", 3000);
juice.price(); // 3000

 

패턴 매칭

패턴 매칭은 타입 확인을 위해 사용하던 instanceof 키워드를 더 쉽게 사용할 수 있게 해줍니다.

// 11 버전
if(o instanceof Integer) {
	Integer i = (Integer) o;
}

// 17버전
if(o instance of Integer i) {
}

 

자료에 맞는 case처리

static double getIntegerValue(Object o) {
	return switch(o) {
		case Double d -> d.intValue();
		case Float f -> f.intValue();
		default -> 0d;
	};
}

 

GraalVM 기반의 스프링 네이티브 공식 지원

JVM 대신에 GraalVM 기반의 스프링 네이티브 이미지를 사용하면 가동 시간이 짧아지고 메모리를 더 적게 소모합니다

.

2.4 스프링 부트 3 코드 이해하기

 

2.4.1 @SpringBootApplication 이해하기

자바의 main() 메서드와 같은 역할,

SpringApplication.run() 메서드는 애플리케이션을 실행합니다.

 

첫 번째 인수는 메인 클래스로 사용할 클래스

두 번째는 인수는 커맨드 라인의 인수들을 전달

 

@SpringBootConfiguration

스프링 부트 관련 설정을 나타내는 애너테이션

 

@ComponentScan

사용자가 등록한 빈을 읽고 등록하는 애너테이션

 

@EnableAutoConfiguration

스프링 부트에서 자동 구성을 활성화 하는 애너테이션

 

 

— 책 불량

인쇄상태 불량,

68page 3번, 4번 문제가 동일한데 답이 다름