Spring - Null-Safety


Null관련 어노테이션

  • NullPointException이 발생하는 것을 방지하기 위해 Spring Framework 5 버전부터 이를 방지하는 어노테이션을 지원하고 있다.
    • @NonNull
    • @Nullable
    • @NonNullApi(패키지 레벨)
    • @NonNullFields(패키지 레벨)
자세히 보기

Spring - SPEL(SPring Expression Language)


AOP(Aspect-Oriented Programming)

  • 프로그래밍에서 발생하는 공통적인 기능을 구현할 때 코드가 중복되지 않도록 모듈화 하는 프로그래밍 기법을 관점지향적 프로그래밍(AOP)라고 한다.
  • 기능별로 Aspect를 만들어 독립적으로 정의하고, 정의된 기능을 어디서 적용해야하는지 명시함으로서 클래스 내부에 구현할 필요 없이 기능을 사용할 수 있다.
  • Java에서는 다중 상속이 불가능하여 AOP가 도입되었다.
자세히 보기

Spring - SPEL(SPring Expression Language)


Spring Expression Language(SpEL)

  • 자바에서 사용할 수 있는 Expression Language를 Spring에서 개선한 표현 언어.
  • SpEL은 기존 EL로부터 메소드 호출, 빈 참조, 객체 그래프와 같은 기능을 추가하여 제공한다.
  • SpEL은 Parser와 같은 클래스를 생성한다면 Spring과 연결되지 않고 독립적으로 사용할 수 있다.
자세히 보기

Spring Ch 2. 추상화 - 데이터 바인딩 추상화(PropertyEditor, Converter, Formatter)


데이터 바인딩

  • Web Application을 개발할 수록 코드는 점점 복잡해지고 여러 스크립트의 객체와 화면으로 입력받는 데이터의 타입이 일치해지기 어려워진다.
  • 예를 들어, 웹에서 form 태그로 값을 입력받아 처리하고자 할 때 입력받는 값은 String이지만 실제 사용되는 데이터는 Date, Boolean 또는 정의된 클래스 객체의 타입으로 사용되며 이를 처리하는 코드를 작성해야한다.
  • 입력 받은 문자열을 객체에 맞는 데이터로 변환하는 작업을 간편하게 하기 위해 Spring에서는 데이터 바인딩 기능을 갖는 인터페이스를 추상화하여 제공하고 있다.

PropertyEditor

  • PropertyEditor는 Spring 3.0버전 전까지 사용되고 있던 데이터 바인딩 인터페이스이다.
  • Text-Object간의 변환을 수행할 수 있도록 getAsText, setAsText 메소드를 제공하고 있다.
  • 그러나 멀티 스레드로 동시에 접근이 이루어질경우 데이터가 변경되기 쉬워 싱글톤으로 사용할 수 없으며 controller에 등록해서 사용해야 한다.
자세히 보기

Spring Ch 2. 추상화 - Validation 추상화


Validation

  • 객체를 검증하기 위해 사용되는 인터페이스.
  • 웹, 서비스 등 모든 계층에 관계가 없어 일반적으로 사용할 수 있다는 장점이 있다.
  • Bean Validation의 Annotation으로 객체의 데이터를 검증할 수 있다.
  • Validator는 기본적으로 다음 두 함수를 오버라이드하여 검증해야한다.
    • boolean supports(class<?>) - 검증할 객체의 타입을 체크하는 함수.
    • void validate(Object, Errors) - 실제 검증이 이루어지는 함수.
자세히 보기

Spring Ch 2. 추상화 - ResourceLoader와 Resource 추상화


Resource 추상화

  • java는 java.net.URL이라는 URL 클래스로 리소스에 접근할 수 있다.
  • classPath 또는 ServletContext 기준 상대경로의 리소스(low-level Resource)에 접근하려면 핸들러를 등록하여 URL접미사를 만들어 사용해야 한다. 이는 코드만으로 리소스의 출처를 확인하기 불편하며 비효율적이고 불편하다.
  • Spring의 Resource 객체는 URL 클래스를 추상화하여 low-level 리소스에 접근할 수 있도록 기능을 제공하고 있다.
자세히 보기

Spring Ch 1. IoC 컨테이너(4) - MessageSource와 EventPublisher


MessageSource

  • 한국어 페이지 뿐 아니라 다른 언어를 사용하는 페이지를 출력하고자 할 때 언어만 다른 html파일을 사용한다면 유지보수가 어렵고 비효율적일 것이다.
  • SpringBoot에서는 국제화 기능을 제공하는 인터페이스 MessageSource를 @Autowired로 자동 등록할 수 있다.
  • .properties파일에 key-value 형식으로 값을 저장하고, MessageSource 객체로 메시지를 받아 사용한다.
자세히 보기

Spring Ch 1. IoC 컨테이너(4) - Profile과 Property


Profile

  • 프로파일으로 런타임 환경을 설정할 수 있다.
  • 빈들을 하나의 환경으로 묶어 선언함으로서 테스트 환경에서 테스트를 수행하고 신속하게 배포 환경으로 전환할 수 있다.
  • @Component 어노테이션으로 등록된 빈들은 DefaultProfile에 존재한다.
  • @Profile 어노테이션으로 프로파일을 등록할 수 있고 !, &, |의 논리 설정을 사용할 수 있다.
자세히 보기

Spring Ch 1. IoC 컨테이너(3) - 빈의 스코프


빈의 스코프

싱글톤

  • 애플리케이션 전반에 걸쳐 빈의 인스턴스가 오직 하나만 존재한다.
  • Autowired에 의해 주입된 싱글톤 객체는 다른 객체에 주입된 싱글톤 객체와 동일한 객체이다.

프로토타입

  • @Scope(“prototype”)으로 프로토타입을 선언한다.
  • 프로토타입 객체는 매 호출마다 객체가 초기화된다.
자세히 보기

Spring - 중복된 빈 등록에 대한 처리


스프링 의존 객체 선택

  • 컴포넌트 Annotation은 싱글톤 범위로 등록되며 같은 타입의 빈이 다른 클래스에서 등록된 경우 에러가 발생한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
public interface Repository {
}
@Repository
public class Repository2 implements Repository{
}
@Repository
public class Repository3 implements Repository{
}
@Service
public class Service{
@Autowired //등록된 빈이 중복되어 에러 발생
Repository repository;
}
자세히 보기