Tiny Bunny [Spring] @Controller 어노테이션과 컨트롤러 통합 - 솜님의 블로그
솜님의 블로그
카테고리
작성일
2024. 10. 10. 12:23
작성자
겨울솜사탕

@Controller 어노테이션

 

 

@Component 어노테이션을 상속받은 어노테이션들이 있다.

  • @Repository - DAO
  • @Service - Service
  • @Controller - Controller

Controller 파일에 @Controller 어노테이션을 달아준다.

그럼 컴파일러가 이 어노테이션을 보고 Controller이라고 인식을 한다.

 

기존에 Controller 인터페이스 파일이 필요 없게 되고,

이를 상속받기 위해 implement Controller를 삭제해 주면 된다.

 

import org.springframework.stereotype.Controller;

@Controller("login")
public class LoginController {

또한 import가 기존에는 web.servlet.mvc.Controller를 하고 있는데,

해당 내용을 지워주고 다시 import를 하면? stereotype.Controller를 import 하여 @Controller를 사용할 수 있게 된다.

 

 

@Controller
- 인터페이스를 쓰면 자유도 제한, 개발자 편함
- 어노테이션 쓰면 자유도 높아지지만 개발자 불편 >> 하지만 성능은 좋아진다.

 

 


컨트롤러 통합

LoginController 안에는 로그인 로직이 존재한다.

로그인 로직이 있다면 당연히 같이 따라오는 로직에는 로그아웃이 있다.

이 로그아웃 로직을 로그인 메서드 아래에 추가한다면 LoginController에 메서드가 2개가 된다.

 

이러한 경우에는 로그인 객체를 어떤 메서드에 맵핑시켜야 하는지 잘 모른다.

인터페이스를 사용했을 땐 핸들러맵퍼가 있었기 때문에 말하지 않아도 알 수 있었지만,

현재는 메서드가 여러 개 있기 때문에 핸들러맵퍼 대신에

@RequestMapping("/login.do") 어노테이션을 사용한다.

그럼 ds-servlet.xml에 있는 bean 핸들러맵핑은 사용하지 않으므로 없어지게 된다.

 

간혹 @RequestMapping(value="/login.do") 라고 쓰라고도 하는데,

value= 는 생략해도 무방하다.

 

 

// LoginController

package com.koreait.app.view.member;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.koreait.app.biz.member.MemberDAO;
import com.koreait.app.biz.member.MemberDTO;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;


@Controller("login")
public class LoginController {
	
	@RequestMapping(value="/login.do")
	public String login(HttpSession session, MemberDAO memberDAO, MemberDTO memberDTO) throws Exception {
																// 커맨드 객체
		/*
		// 1. 사용자(클라이언트,브라우저)가 보낸 파라미터에서 값 추출
		String mid=request.getParameter("mid");
		String password=request.getParameter("password");

		// 2. DB 연동
		memberDTO.setMid(mid);
		memberDTO.setPassword(password);
		*/
		memberDTO = memberDAO.selectOne(memberDTO);

		// 3. 페이지 이동 == 네비게이션
		if(memberDTO != null) {
			session.setAttribute("userName", memberDTO.getName());
			return "main";
		}
		return "redirect:login.jsp";
	}
	
	@RequestMapping("/logout.do")
	public String logout(HttpSession session) {
		session.removeAttribute("userName");
		return "redirect:login.jsp";
	}
	
	@RequestMapping("/main.do")
	public String mainPage() {
		return "main";
	}

}

 

어떠한 웹 페이지에 이와 같이 서로 관계가 있는 로직을 하나로 묶어 관리할 수 있는데,

이렇게 하면 응집도를 높일 수 있다!

응집도를 높인다 == 서로 연관 있는 것만 관리를 하겠다는 뜻

 

이러한 작업을 컨트롤러 통합이라고 한다.

 

핸들러맵퍼에 의해 맵핑된 메서드 인자는 (HttpServletRequest, request)이다.

request를 보면 알 수 있겠지만, new 하지 않았는데 데이터를 받아올 수 있다.

 

따라서 인자로 DTO 객체를 받아온다면?

코드에 new를 사용하지 않게 된다.

 

session이 필요한 경우 인자로 request가 필요한 것이 아니라 Session이 필요한 것이므로

HttpSession session을 넣어주면 된다.

 

🍀정리
- 원래 request만 썼는데, 필요한 것들만 인자로 적으면 Spring 컨테이너가 new 해준다.
- 이때 인자로 DTO를 반영해서 DTO 맵핑을 자동으로 해주기 때문에 request가 필요가 없어지고,
  이 때문에 완전한 POJO에 가까워지게 된다.
- DAO 또한 멤버변수로 빼서 사용하고 있는데, 인자로 반영해 준다면 의존성 또한 사라진다.
- 관리를 스프링 컨테이너에서 해주는 객체 == 커맨드 객체라고 한다.
  : 특별히 DTO류에게 이렇게 많이 불린다.