본문 바로가기
스프링

Spring

by 공부 안하고 싶은 사람 2021. 6. 28.
반응형

특징

  • 경량 컨테이너로서 자바 객체를 직접 관리. 객체 생성, 소멸 같은 생명주기 관리. 스프링으로부터 필요한 객체 얻어옴.
  • IOC(Inversion of Control)
    제어권의 역전. 제어권이 스프링 프레임워크에 있음. 개발자가 제어권을 가지지 않음.
  • DI(Dependency Injection)
    의존성 주입. 계층이나 서비스 간에 의존성이 존재할 경우 스프링 프레임워크가 서로 연결
  • AOP(Aspect-Oriented Programming)
    관점지향 프로그래밍. 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 사용.
  • POJO(Plain Old Java Object)
    다른 클래스를 상속받아 만들 필요 없는 자바 클래스
  • 영속성과 관련된 다양한 서비스 지원
    iBatis, Hibernate등 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스 제공
  • 확장성이 높음

 

 

설정파일

  • 부트가 아닌 일반spring 설정은 아래와 같다
  • servlet-context.xml에서 viewresolver, resources경로, base-package설정 관리
  • root-context.xml에서 component-scan, db설정과 같은 application.config설정을 관리
  • web.xml에서 위 2가지 경로와, 필터들, servlet 패턴을 설정

 

 

IoC

  • Spring IoC Contaner : IOC기능을 제공하는 컨테이너. Bean들을 담고있음 Bean 정의를 읽어들이고, Bean을 구성하고 제공.(Bean을 만들어주고, 엮어주고, 제공해줌)
  • BeanFactory : Bean의 생성과 설정, 관리를 맡고있음
  • Bean : 컨테이너 안에 들어있는 객체들. 컨테이너에 담겨있기 때문에, 사용하려면, 컨테이너에서 가져와야한다.(Bean끼리만 주입가능)
  • Bean의 Scope : default로 싱글톤, 프로토타입으로 매번 다른객체 생성가능
  • application.xml에서 빈 등록 -> ApplicationContext에서 설정파일 추가
    -> @Configuration + @ComponentScan("basePackageClasses")+ @Bean으로 리턴객체 Bean으로 추가
  • @Autowired 중복된 이름의 빈을 사용시 -> @Primary, @Qualifer, @Resource(리스트)로 처리
    -> Field Injection 보다는 Constructor Injection을 권장하는데 그 이유
    • Field에 instance를 생성해야하기 때문에 final/immutable로 필드를 정의할 수가 없다
    • DI Container와 강한 결합이 생긴다. 즉, 외부에서 사용하려면 DI Container를 이용해야 한다.
      (단위 테스트에도 영향)
    • Interface(constructors or setter)에 의해 의존성을 명확하게 나타내지 않아 외부에서 의존성이 보이지 않는다
    • 순환 의존성(두 클래스가 서로 참조)의 경우 Field Injection은 Compile time에 에러를 발견하지 못한다.Constructor Injection은 BeanCurrentlyCreationExeption 발생

 

 

Profile(EnvironmentCapable) & Property & Message

-> Boot에서 편하게 설정할 수 있다.

 

 

ApplicationEventPublisher

이벤트 기반의 프로그래밍을 할 때 유용한 인터페이스

이벤트 클래스가 있다면 아래와 같이 핸들러실행 (순서와 비동기에 주의하여 사용하자)

@Component
public class MyEventHandler {
    @EventListener
    public void print(MyEvent event){
        event.getData();
    }
}

 

 

ResourceLoader

ResourceLoader를 주입받아 프로젝트내(/resource 아래의) 리소스를 읽어올 수 있다. (이후에 validation 체크 필요)

 

 

Validation

Boot의 어노테이션으로 쉽게하자
@NotEmpty, @Email 등

 

 

데이터 바인딩(비추)

PropertyEditorSupport를 상속받은 클래스 + 컨트롤러에 아래와 같이 사용하면
request값을 dto로 바인딩하여 받을 수 있다.

@InitBiner
public void init(WebDataBinder webDataBinder) {
    webDataBinder.registerCustomEditor(바인딩클래스, new PropertyEditorSupport);
}

Converter(추천)

String <-> object 이외에도 Thread safe하게 변환가능

  • Converter<source, target> 을 구현
public static class StringToEventConverter implements Converter<String, Event> {
    @Override
    public Event convert(String s) {
        return new Event(Integer.parseInt(s));
    }
}
  • 설정 추가
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry formatterRegistry) {
        formatterRegistry.addConverter(new StringToEventConverter());
    }
}
  • 사용
@GetMapping("/event/{event}")
public String getEvent(@PathVariable Event event){ // @PathVariable로 Event를 도메인으로 받음
    System.out.println(event);
    return event.getId().toString();
}

Formatter(강추)

  • Formatter 구현
public class EventFormatter implements Formatter<Event> {
    @Override    // 문자를 받아서 객체로(Locale 정보를 기반으로)
    public Event parse(String s, Locale locale) throws ParseException {
        return new Event(Integer.parseInt(s));
    }
    @Override    // 객체를 받아서 문자로(Locale 정보를 기반으로)
    public String print(Event event, Locale locale) {
        return event.getId().toString();
    }
}
  • 설정추가
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry formatterRegistry) {
        formatterRegistry.addFormatter(new EventFormatter());
    }
}
  • 적용 (위와 동일)

 

 

SpEL

  • #{"표현식"}
  • ${"properties"}
  • #{${}} 가능

 

 

AOP

적용법 : 만약 Class A에 Perf라는 메서드가 있고, Hello라는 Aspect가 있고, Class A의 Perf메서드가 실행 되기 전에 항상 Hello를 출력해야한다고 가정한다.

  1. 컴파일 타임자바 파일을 클래스파일로 만들 때, 바이트 코드들을 조작하여, 조작된 바이트 코드들을 생성
  2. 즉, A.java 파일이 A.class로 변환될 때, A.class 파일에 Hello를 출력하는 메서드가 포함되어 있어야한다.
  3. AspectJ가 사용
  4. 로드 타임
    AspectJ가 사용즉, A의 바이트코드는 변함이 없지만, 로딩하는 JVM 메모리 상에서는 Perf라는 메서드 전에 Hello를 출력하는 메서드가 같이 포함된 상태로 로딩
  5. A.java는 순수하게 A.class로 컴파일 되었지만, A.class를 로딩하는 시점에 Hello를 출력하는 메서드를 끼워넣는 방법
  6. 런타임
    스프링 AOP가 사용하는 방법이다.
  7. A라는 Bean(Class A를 뜻함)을 만들 때(spring 어플리케이션에서 Bean을 만드는 과정은 런타임이다.), A라는 타입의 프록시 Bean을 만든다.
    이 프록시 Bean이 실제 A가 가지고 있는 Perf라는 메서드를 호출하기 직전에 Hello를 출력하는 일을 하고, 그 다음에 A를 호출한다.

 

 

Null-Safety

  • @NonNull
  • @Nullable
  • Intellij로 전체 설정가능

 

 

컴파일(javac) -> .java를 .class로 컴파일

JVM - .class파일을 바이트코드로 변환(인터프리터, JIT 사용)

JRE - 자바를 실행할 수 있는 환경

JDK - JRE + 개발 툴

GC - 현재 클래스가 접근가능하다면 유지 아니면 버리기,new-gen / old-gen

728x90
반응형

'스프링' 카테고리의 다른 글

스프링 핵심 원리 - (3)  (0) 2022.08.03
스프링 핵심 원리 - (2)  (0) 2021.09.10
스프링 핵심 원리 - (1)  (0) 2021.09.10
필터 / 인터셉터 / AOP  (0) 2021.06.28
Logback  (0) 2021.05.25

댓글