1. 빈 + 컨테이너
웹 프로젝트 = 대형 화물선 컨테이너 = 화물 컨테이너 자바 빈 = 화물
- EJB (Enterprise Java Beans): 서버측 컴포넌트 모델 / 애플리케이션의 업무 로직을 가지고 있는 서버 애플리케이션, 주로 업무 로직을 처리하는 역할
- POJO (Plain Old Java Object): 일반 자바 클래스
- Bean : 자바 클래스
2. IoC 패턴 활용
Inversion of Control : 제어의 역전
- 원칙 1. 하이레벨 모듈은 로우레벨 모듈에 의존하면 안 되고 모두 인터페이스에 의존해야 한다.
- 원칙 2. 추상화는 세부사항에 의존해서는 안된다. = 세부사항이 추상화에 의존해야 한다.
- 인터페이스를 활용해서 모듈간 결합도를 낮추는 것이 목적
Dedencency Injection (DI) : 의존성 주입
- 필요한 객체를 직접 생성하는 것이 아니라 외부로부터 필요한 객체를 받아서 사용하는 것
- 객체간 결합도를 줄이고, 코드의 재활용성을 높인다.
- 즉, 한 클래스를 수정했을 때 이를 참조하는 다른 클래스를 수정하는 상황을 방지하도록 코드 작성
2.1 인터페이스와 스프링
- workmanager 인터페이스
package ..;
public interface WorkManager {
public String doIt();
}
- workmanager 라는 인터페이스를 상속받은 Boss 클래스로, doIt 메소드를 오버라이드해서 문자열 반환
package ..;
public class Boss implements WorkManager{
@Override
public String doIt(){
return "do boss";
}
}
- workmanager 라는 인터페이스를 상속받은 Employee 클래스로, doIt 메소드를 오버라이드해서 문자열 반환
package ..;
public class Employee implements WorkManager{
@Override
public String doIt(){
return "do work";
}
}
- 인터페이스를 상속해서 만들어진 각 클래스 Employee 와 Boss를 호출하는 클래스
package ..;
public class WorkService {
WorkManager workManager;
public void setWorkManager(WorkManager workManager){
this.workManager = workManager;
}
public void askWork() {
System.out.println(workManager.doIt());
}
}
- setWorkManager로 workService 클래스 속성이 생성된다. 메인 메소드
package ..;
public class Example{
public static void main(String args[]) {
WorkService workService = new WorkService();
WorkManager employee = new Employee();
WorkManager boss = new Boss();
workService.setWorkManager(employee);
workService.askWork();
workService.setWorkManager(boss);
workService.askWork();
}
}
>>
do work
do boss
xml 설정, dispatcherServlet 설정, 스프링 mvc 설정 읽고 넘어감
2.2 컨트롤러와 뷰
- @Controller 어노테이션 : 해당 클래스가 컨트롤러임을 명시
- @RequestMapping 으로 전달한 값을 경로 명으로
- 반환되는 문자열이 뷰 이름
2.3 인터셉터
컨트롤러가 요청 처리 전 후에 대한 로직 추가할 수 있다.
- HandlerInterceptorAdaptor 클래스
- 추상 클래스
- AsyncHandlerInterceptor 인터페이스 상속
- example
package info.thecodinglive.interceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class JpubInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle 메소드 실행");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle 메소드 실행");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion 메소드 실행");
}
// 비동기 처리를 위한 메소드
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
super.afterConcurrentHandlingStarted(request, response, handler);
}
}
- 활용 example
package info.thecodinglive.interceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by ysj on 2017-12-04.
*/
public class ExecuteTimeInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
String reqUri = request.getRequestURI();
System.out.println("reqUrl: " + reqUri);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
}
References
- 스프링 부트로 배우는 자바 웹 개발 (윤석진) 기술서를 참고하여 정리한 내용입니다.
'웹 개발 > Spring Boot' 카테고리의 다른 글
Spring Boot) 5. REST API 서버 만들기 + REST 관련 요소 (0) | 2021.04.28 |
---|---|
Spring Boot) 4. 스프링 부트 웹 개발 (2) | 2021.04.28 |
Spring Boot) 2. 서블릿 Servlet (0) | 2021.04.28 |
Spring Boot) 1. 개발 환경의 변화와 자바 (0) | 2021.04.28 |
Spring Boot) Spring Boot 프로젝트 예제로 기초 이해하기 / Building an Application with Spring Boot (0) | 2021.04.22 |