본문 바로가기

spring

(10)
스프링 컨테이너의 관계 1. 톰캣 서버를 구동하면 web.xml 파일을 로딩하여 서블릿 컨테이너가 구동된다. 2. 서블릿 컨테이너는 web.xml 파일에 등록된 ContextLoaderListener 객체를 생성(pre Loading) 한다. 이때 ContextLoaderListener 객체는 src/main/resources 소스 폴더에 있는 appliccationContext.xml 파일을 로딩하여 스프링 컨테이너를 구동하는데, 이를 'Root 컨테이너'라고 한다. 그리고 이때, Service 구현 클래스나 DAO 객체들이 메모리에 생성된다. 그리고 사용자가 로그인 버튼 ".do" d요청을 서버에 전달하면 서블릿 컨테이너는 DispatcherServlet 객체를 생성하고 3 . DispatcherServlet 객체는 /WE..
어노테이션 - @Component 를 설정했으면 이제 스프링 설정 파일에 클래스들을 일일이 엘리먼트로 등록할 필요가 없다. @Component만 클래스 선언부 위에 설정하면 끝난다. 예를 들어, LgTV 클래스에 대한 등록을 XML 설정과 어노테이션 설정으로 처리하면 다음과 같다. XML 설정 Annotation 설정 @Component public class LgTV implements TV { public LgTV() { System.out.println("===> LgTv 객체 생성"); } } 당연한 얘기겠지만 여기에서 두 설정 모두 해당 클래스에 기본 생성자가 있어야만 컨테이너가 객체를 생성할 수 있다. 이렇게 설정했다면 클래스의 객체가 메모리에 생성되는 것은 문제 없다. 그러나 클라이언트 프로그램에서 LgTV 객체를 요청할 수..
의존성 주입 어노테이션 - @Autowired @Autowired는 생성자나 메소드, 멤버변수 위에 모두 사용할 수 있다. 어디에 사용하든 결과는 같지만, 대부분 멤버변수 위에 선언하여 사용한다. 스프링 컨테이너는 멤버변수 위에 붙은 @Autowired를 확인하는 순간 해당 변수의 타입을 체크한다. 그리고 그 타입의 객체가 메모리에 존재하는지를 확인한 후에, 그 객체를 변수에 주입한다. 만약 @Autowired가 붙은 객체가 메모리에 없다면 컨테이너가 NoSuchBeanDefinitionException을 발생시킨다. @Autowired의 기능을 테스트하기 위해서 LgTv 클래스에 다음과 같이 멤버변수를 추가하고 의존관계를 설정한다. package polymorphism; @Component("tv") public class LgTv implemen..
Command 객체 Command 객체는 Controller 메소도 매개변수로 받은 VO(Value Object) 객체라고 보면 된다. InsertBoardController 클래스의 insertBoard() 메소드를 Command 객체를 이용하여 구현한다. @Controller public class InsertBoardController { @RequestMapping(value="/insertBoard.do") public void insertBoard(BoardVO vo) { } } insertBoard() 메소드의 매개변수로 사용자가 입력한 값을 매핑할 BoardVO 클래스를 선언하면, 스프링 컨테이너가 insertBoard() 메소드를 실행할 때 Command 객체를 생성하여 넘겨준다. 그리고 이때 사용자가 입력..
Spring MVC 구조 - (하) Spring MVC 수행 흐름 strtus를 비롯한 대부분의 MVC 프레임워크는비슷한 구조를 가졌다. 따라서 하나의 프레임워크만 잘 이해한다면 다른 프레임워크도 쉽게 이해할 수 있다. 우리는 앞에서 Spring MVC 구조가 전혀 새롭지는 않을 것이다. 그림 5 - 1은 클라이언트의 요청을 시작으로 Spring MVC를 구성하는 각 요소가 어떻게 동자갛는지를 표현했으며, 각 번호에 대한 설명을 아래에 추가했다. 그림의 번호와 설명을 번갈아 가며 확인하기 바란다. 1. 클라이언트로부터 모든 ".do" 요청을 DispatcherServlet이 받는다. 2. DispatcherServlet은 HandlerMapping을 통해 요청을 처리할 Controller를 검색한다. 3. DispatcherServlet은..
IOC(Inversion of Control)컨테이너 - 서블릿 컨테이너 스프링 프레임워크를 이해하는데 가장 중요한 개념이 바로 컨테이너이다. 컨테이너의 개념은 스프링에서 처음 사용된 것은 아니며, 기존의 서블릿이나 EJB 기술에서 사용해왔다. 그리고 대부분 컨테이너는 비슷한 구조와 동작 방식을 가지고 있으므로 서블릿 컨테이너를 통해 스프링 컨테이너의 동작 방식을 유추해볼 수 있다. 다음과 같이 간단한 서블릿 클래스를 만들었다고 가정하자. HelloServlet.java public class HelloServlet extends HttpServlet { public HelloServlet() { System.out.println("===> HelloServlet 객체 생성"); } protected void doGet(HttpServletRequest request, Htt..
MVC 프레임워크 구현 - (중) Controller 인터페이스 작성 Controller를 구성하는 요소 중에서 DispatcherServlet은 클라이언트의 요청을 가장 먼저 받아들이는 Front Controller이다. 하지만 클라이언트의 요청을 처리하기 위해 DispatcherServlet이 하는 일은 거의 없으며, 실질적인 요청 처리는 각 Controller에서 담당한다. 구체적인 Controller 클래스들을 구현하기에 앞서 모든 Controller를 같은 타입으로 관리하기 위한 인터페이스를 만들어야 한다. 클라이언트의 요청을 받은 DispatcherServlet은 HandlerMapping을 통해 Controller 객체를 검색하고, 검색된 Controller를 실행한다. 이때 어떤 Controller 객체가 검색되더라도 같은..
@ModelAttribute와 커맨드 객체(2) 커맨드 객체(Command Object) 커맨드 객체(Command Object)란 HttpServletRequest를 통해 들어온 요청 파라미터들을 setter메서드를 이용하여 객체에 정의되어있는 속성에 바인딩이 되는 객체를 의미합니다. 커맨드 객체는 보통 VO 나 DTO를 의미하며, HttpServletRequest로 받아오는 요청 파라미터의 key 값과 동일한 이름의 속성들과 setter 메서드를 가지고 있어야 합니다. 어떻게 자동으로 바인딩을 시켜주냐 하면, 스프링이 내부적으로 HttpServletRequest와 커맨드 객체의 setter 메서드를 이용하여 알아서 바인딩 시켜줍니다. 마치 객체를 JSON 형식으로 변환하기 위해 Jackon2ObjectMapperBuilder가 autoDetectG..