Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Programing_Java

✨ Spring MVC에서의 로그인 처리 흐름 : DispatcherServlet부터 Command 객체까지 정복 본문

✅ Spring

✨ Spring MVC에서의 로그인 처리 흐름 : DispatcherServlet부터 Command 객체까지 정복

Joyfullyever 2025. 4. 17. 17:05

🧩 로그인 기능 구현 시 가장 중요한 구조는?

로그인 기능을 만들다 보면, 아래처럼 여러 컴포넌트가 관여하게됨

• LoginController

• LoginService

• LoginDAO

• LoginVO (Command 객체)

이때 가장 중요한 건 역할을 분리, 결합도를 낮추는 설계
예를 들어, Controller에서 DAO를 직접 new 하지 않는다. 대신 Service를 통해 간접 호출하고, Service는 DAO와 의존 관계를 맺음

@Controller
public class LoginController {

    @Autowired
    private LoginService loginService;

    @PostMapping("/login")
    public String login(LoginVO vo, HttpSession session) {
        boolean result = loginService.loginCheck(vo);
        if(result) {
            session.setAttribute("user", vo);
            return "redirect:/main";
        }
        return "redirect:/login?error";
    }
}

 

🔁 객체 생성은 누가? 스프링 컨테이너가 함

전통 방식에서는 DispatcherServlet을 직접 만들었지만, Spring에서는 스프링이 제공하는 DispatcherServlet을 web.xml에 등록

<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

중요한 포인트 :

• 스프링 컨테이너가 new 하는 유일한 서블릿 객체는 DispatcherServlet

• DispatcherServlet은 **/WEB-INF/dispatcherServlet-servlet.xml**을 로딩

• 이 xml이 applicationContext 역할을 대신 수행하며, 나머지 @Component 객체들을 관리

 

📦 @Component 계열 어노테이션을 활용한 자동 등록

@Controller // 컨트롤러 역할
@Service    // 비즈니스 로직 계층
@Repository // DAO 계층
@Component  // 기타 일반 빈

이 어노테이션을 쓰면 스프링이 알아서 객체를 생성해서 컨테이너에 등록
특히 @Controller는 Spring MVC 구조에서 컨트롤러임을 명확히 하며, 가독성과 관리 효율성이 높아짐

 

💡 자유도와 응집도, 그리고 메서드 시그니처

@Controller 사용 시 장점은 많지만, 자유도가 높아질수록 개발자의 책임도 커짐

• 메서드 인자: HttpServletRequest, HttpSession, Model, Command 객체 등 자유롭게 선언 가능

• 메서드명: 원하는 이름으로 설정 가능 → 관련 기능끼리 묶어 높은 응집도

• 반환형: ModelAndView, String, ResponseEntity 등으로 다양하게 사용 가능

 

🧙‍♂️ Command 객체란?

POST /login.do 요청 처리 시, 사용자 입력 데이터를 자동으로 VO에 바인딩해주는 객체를 Command 객체라고 부름

public class LoginVO {
    private String id;
    private String password;
    
    // getter/setter
}
@PostMapping("/login")
public String login(LoginVO vo) {
    // id, password 값이 자동으로 들어옴
}

 

✔️ 조건 : 입력 폼의 name 속성과 VO의 필드명이 일치해야 함

스프링이 자동으로 :

1. new LoginVO()

2. request.getParameter("id") 값을 setId()에 넣어줌

3. 완성된 객체를 메서드 인자로 전달

 

📌 요약 정리

요소설명

DispatcherServlet 유일하게 new 되는 서블릿 (Spring이 제공)
DispatcherServlet-servlet.xml 해당 서블릿이 참조하는 설정 파일 (컨테이너 역할)
@Controller, @Service, @Repository 객체를 자동 생성하여 스프링 컨테이너에 등록
Command 객체 사용자 입력 값을 자동으로 바인딩하여 전달받는 VO