본문 바로가기

웹 개발/Spring Boot

Spring boot) 3. 스프링 프레임워크

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

  • 스프링 부트로 배우는 자바 웹 개발 (윤석진) 기술서를 참고하여 정리한 내용입니다.