Spring

sangeun·2020년 5월 6일
0

새로운 면접준비

목록 보기
1/2

Spring을 사용하는 이유

  • 객체지향적인 프로그래밍을 위해서
  • aop, ioc, di, psa를 사용하여 훨씬 간단한 프로그래밍 가능

어떻게 객체지향적인 프로그래밍을?

  • aop는 분산된 책임을 한 곳에 집중시키므로 srp원칙을 지킬 수 있음
  • ioc는 객체의 생성과 라이프사이클 관리를 프레임워크에 맡기는 방식이므로, 의존성을 줄일 수 있음
  • psa를 이용해서는 환경에 구애받지 않는 프로그래밍을 할 수 있으므로 의존성을 줄일 수 있다.

AOP

AOP란?

분산되어있는 횡단관심사들을 핵심로직들과 분리해 한곳에 모아서 개발하는 기법

어떻게 구현하는가?

프록시 기반으로 다이나믹 프록시나 CGLib를 통해서 구현되거나, 타깃 오브젝트를 직접 조작하는 방식의 AspectJ방식이 있습니다. Spring AOP에서는 다이나믹 프록시나 cglib사용

  • 다이나믹 프록시는 인터페이스에 적용하는 프록시이기 때문에 인터페이스가 필요
  • CGLib는 클래스를 상속해서 프록시를 만들기 때문에 final 클래스는 불가. 런타임 위빙, 하지만 나중에 캐싱해서 사용하기는 함
  • AspectJ는 프록시를 타깃 오브젝트 앞에 두지 않고, 타깃 오브젝트 자체를 직접 조작. 클래스 or 클래스로드 타임 위빙을 하기 때문에 좀더 빠르다.

IOC

IOC란?

  • 프로그램의 흐름을 프레임워크에 위임하는 방식
  • 구체적으로 이야기하면 객체의 라이프사이클을 프레임워크에서 관리
  • 방법으로 DI와 DL을 사용함

DI란?

  • 객체를 주입받는 방식
  • DI사용 이유: 의존 객체를 매번 직접 생성하면 메모리 낭비도 있고, 객체 수정을 하면 산탄총 수술을 해야 함
  • 테스트에도 편리(테스트시에는 테스트를 위한 클래스를 주입해줄수도 있음)
  • setter, 생성자, 필드 주입 방식

어느 주입 방식이 가장 좋은가?

  • 생성자 주입 방식
  • immutable한 객체를 만들 수 있고, 객체 생성시점에서 순환참조 여부를 알 수 있다. (왜? -> 컨테이너가 빈을 생성하는 시점에 객체생성을하는데, 그때 순환참조가 생기기 때문. 필드주입 같은 경우에는 객체생성시점에 필드주입을 하지는 않는듯.)

https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/

DL이란?

IOC컨테이너를 참조해 얻고자하는 객체를 검색하는 것

PSA

PSA란?

  • 환경에 구애받지 않고 프로그래밍을 할 수 있는 추상화 기법
  • 예: PlatformTransactionManager은 구현체가 변경되더라도 동일한 인터페이스로 프로그래밍 가능

final, static

final

객체마다 하나씩 가지고, 값을 바꿀 수 없음

static final

클래스에 하나뿐이고, 값을 바꿀 수 없는 엄연한 상수

static 변수는 어디에 올라가는가?

  • method area에 정적으로 클래스 정보를 올릴 때 올라감
  • heap 영역에 동적으로 생성되는 객체들은 GC의 영향을 받지만, method area에 들어간 클래스 정보들은 프로그램이 끝날때까지 계속 유지되므로 남발하면 안됨

JPA

JPA란?

자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스

Hibernate란?

JPA의 구현체

Spring Data JPA란?

  • JPA를 쓰기 편하게 만들어놓은 모듈
  • Repository라는 추상화 인터페이스가 핵심
  • Repository에 적합하게 함수명을 만들면 자동으로 쿼리를 만들어준다.

ORM

  • 객체와 관계형 데이터를 자동으로 매핑시키는 것
  • Sequelize, JPA 등 써봄
  • 장: 비즈니스 로직에 집중 가능, 추상화로 인해 DB의 구현에 덜 의지하게 됨
  • 단: 프로시저가 많은 경우에는 도입이 까다로움

스프링 트랜잭션

profile
꾸준히

0개의 댓글