본문 바로가기
Spring

[Spring] 자바 스프링 프레임워크/스프링 부트 기본 지식 - JAVA Spring framework, Spring boot

by 개발하는 지토 2020. 8. 22.

2020/08/22 스프링 강의를 들으며 정리한 내용...

 

아래와 같은 내용 노션(Notion) : www.notion.so/Spring-Framework-9d5d2fcafdcb4fc18de030df1797de93


스프링 프레임워크/Spring Framework

Inversion of Control

제어권이 뒤바뀜!

일반적인 (의존성에 대한) 제어권: "내가 사용할 의존성은 내가 만든다."

 

IoC: "내가 사용할 의존성을 누군가 알아서 주겠지"

  • 내가 사용할 의존성의 타입(또는 인터페이스)만 맞으면 어떤거든 상관없다.
  • 그래야 내 코드 테스트 하기도 편하지

IoC (Inversion of Control) 컨테이너

ApplicationContext (Bean Factory)

빈(bean)을 만들고 엮어주며 제공해준다.

빈 설정

  • 이름 또는 ID
  • 타입
  • 스코프

컨테이너를 직접 쓸 일은 많지 않다.


빈 (Bean)

스프링 IOC 컨테이너가 관리하는 객체

등록하는 방법?

omponent Scanning

  • @Component
    • @Repository
    • @Service
    • @Controller
    • @Configuration
  • 또는 직접 XML이나 자바 설정 파일에 등록

꺼내 쓰는 방법?

  • @Autowired 또는 @Inject
  • ApplicationContext에서 getBean()으로 직접 꺼내기

특징

  • 오로지 "빈"들만 의존성 주입을 해준다.

ETC.

@ComponentScan

  • IOC 컨테이너가 만들어질때 빈에 등록할 객체들을 어느지점부터 찾을지 알려줌

    → Component Scanning

 

Repository는 SpringData JPA가 제공해주는 기능에 의해서 빈으로 등록됨

→ 특정 인터페이스(Repository)를 상속받고 있는 인터페이스를 찾아서 내부에서 구현체를 만들 어서 빈으로 등록함


의존성 주입 (Dependency Injection)

필요한 의존성을 어떻게 받아올 것인가!

@Autowired / @Inject를 어디에 붙일까?

  • 생성자
  • 필드
  • Setter

AOP (Aspect Oriented Programming)

흩어진 코드를 한 곳으로 모아!

공통적으로 사용하던 코드를 따로 모아서 작성함

다양한 AOP 구현 방법

  • 컴파일 : A.java —(AOP)—> A.class(AspectJ)
  • 바이트코드 조작 : A.java → A.class —(AOP)—> 메모리 (AspectJ) : 클래스 로더가 클래스를 읽어서 메모리에 올릴때 조작함

프록시 패턴 (스프링 AOP) : 기존 코드 건드리지 않고 새 기능 추가하기 : link

AOP 적용 예제

@LogExecutionTime 으로 메소드 처리 시간 로깅하기

@LogExecutionTime 어노테이션 (어디에 적용할지 표기해두는 용도)

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExcutionTime {
}

실제 Aspect ( @LogExecutionTime 어노테이션 달린곳에 적용 )

@Component
@Aspect
public class LogAspect {
	
	Logger logger = LoggerFactory.getLogger(LogAspect.class);

	@Around("@annotation(LogExcutionTime)")
	public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
		StopWatch stopWatch = new StopWatch();
		stopWatch.start();

		Object proceed = joinPoint.proceed();

		stopWatch.stop();
		logger.info(stopWatch.prettyPrint());

		return proceed;
	}
}

PSA (Portable Service Abstraction)

잘 만든 인터페이스!!

환경의 변화와 관계없이 일관된 방식의 기술로의 접근 환경을 제공하려는 추상화 구조

  • POJO 원칙을 철저히 따른 Spring 의 기능으로 Spring 에서 동작할 수 있는 Library 들은 POJO 원칙을 지키게끔 PSA 형태의 추상화가 되어있음을 의미
  • 외부 라이브러리들은 Spring에서 사용할 때 내부구현이 달라지더라도 동일한 인터페이스로 동일한 구동이 가능하게끔 설계되어 있으며 의존성을 고려할 필요가 없다.

스프링 웹 MVC (Model, View, Controller)

@Controller 와 @RequestMapping

스프링 트랜잭션

Platform TransactionManager

@Transactional


 

 

댓글