Springboot 기초 - HandlerMethod 와 세션관리(login,logout)

Hailey·2025년 3월 8일

SPRING

목록 보기
9/15
post-thumbnail

@Value와 yml파일

test:
  value: hell world!
  age: 10

yml파일은 위와 같은 형식으로 작성해야 한다.

package com.ohgiraffers.chap01;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Chap01AutoConfigurationLectureSourceApplication {

    public static void main(String[] args) {
        SpringApplication.run(Chap01AutoConfigurationLectureSourceApplication.class, args);
    }

}
@Configuration
public class SpringConfiguration {
    @Value("${test.value}")
    public String testValue;

    @Value("${test.age}")
    public String testAge;

    /* 설명. @Value는 시스템 환경변수도 불러올 수 있다. */
    @Value("${username}")
    public String userName;

    @Bean
    public Object propertReadTest() {
        System.out.println("testValue: " + testValue);
        System.out.println("testAge: " + testAge);
        System.out.println("userName: " + userName);

        return new Object();
    }
}

스프링은 리다이렉트되더라도 화면의 재료를 유지할 수 있다 내부적으로 request를 사용하기 떄문이다.

HandlerMethod

앞으로 나올 코드들은 HTTP 요청을 컨트롤러에서 처리하는 방법을 배우기 위한 예제이다.

@RequestMapping

@RequestMapping(value="/menu/regist", method= RequestMethod.GET)
public String registMenu(Model model) {
		model.addAttribute("message", "POST 방식의 메뉴 수정용 핸들러 메소드 호출함...");
        return "mappingResult";
}

/menu/regist라는 URL에 GET 요청이 들어오면 이 메서드가 실행된다.

Model model을 사용하여 View(HTML)에 데이터를 전달한다.

return "mappingResult";는
"mappingResult"라는 뷰 파일(html)을 응답으로 보내겠다는 뜻이다.

@PostMapping

RequestMapping에 method를 따로 지정하는 대신
아예 처음부터 PostMapping 이나 GetMapping을 쓸 수 있다.

@PostMapping("/menu/modify")
public String modifyMenu(Model model) {
    model.addAttribute("message", "POST 방식의 메뉴 수정용 핸들러 메소드 호출함...");
    return "mappingResult";
}

/menu/modify라는 URL에 POST 요청이 들어오면 registMenu메소드가 실행된다.
Model을 이용해 메시지를 전달하고, "mappingResult" 뷰를 반환.

POST 요청은 일반적으로 데이터를 서버에 변경·저장할 때 사용된다.

@GetMapping

@GetMapping("/menu/regist")
    public String registMenu(Model model) {
        model.addAttribute("message", "신규 메뉴 등록용 핸들러 메소드 호출함...");
        return "mappingResult";
    }

위와 같은 원리지만, /menu/delete에 대한 GET 요청을 처리합니다.


즉, 클라이언트가 특정 URL로 GET, POST 등의 요청을 보낼 때, 이를 컨트롤러에서 어떻게 매핑하고 처리하는지를 배우는 코드다!

@RequestMapping, @GetMapping, @PostMapping는 핸들러 메서드를 만드는 annotation이고 이들이 붙은 메서드가 핸들러 메서드이다!

    // 예시 : 📌 POST 요청을 처리하는 핸들러 메서드
    @PostMapping("/menu/delete")
    public String postDeleteMenu(Model model) {
        model.addAttribute("message", "POST 방식의 메뉴 삭제용 핸들러 메소드 호출함...");
        return "mappingResult";
    }
}

이 핸들러 메소드를 활용하여 특정 URL을 처리한다.

반환형이 없는 핸들러 메소드

이 경우 요청경로를 반환한다.

@GetMapping("/regist")
    public void regist(){
    }

이렇게 void인경우, 요청경로인 /regist를 그대로 반환한다.

@GetMapping("/regist")
  public String regist() {
     return "/first/regist";
   }

이 경우와 같다고 볼 수 있다.


세션 관리와 모델 전달

Model과 Session은 다르지만,
@SessionAttributes를 이용하면 모델에 저장된 값을 세션에 자동으로 저장하도록 할 수 있다.

@SessionAttributes("id")

이 어노테이션은 id라는 이름으로 Model에 담긴 값을 HttpSession에 자동으로 저장해줍니다. 또한, 세션에 값을 넣고 빼는 데 사용됩니다

@Controller
@RequestMapping("/first") 
//클래스 내의 모든 메소드가 /first로 시작하는 URL을 처리
@SessionAttributes("id")
//id라는 이름으로 Model의 값을 HttpSession에저장

public class FirstController {
	}

HttpServletRequest

HttpServletRequest를 통해 요청 파라미터를 받을 수 있다!

1.request는 입력값을 담는 용도

HttpServletRequest에서 값을 꺼내와서 model에 전달해준다!

2.Model은 백엔드에서 동적 페이지를 만들 때 사용

@PostMapping("regist")
    public String registMenu(HttpServletRequest request, Model model) {
        String name = request.getParameter("name");
        int price = Integer.parseInt(request.getParameter("price"));
        int categoryCode = 			 Integer.parseInt(request.getParameter("categoryCode"));
        
         /* 설명. 비즈니스 로직 이후 DB에 insert를 성공하고 돌아왔다는 가정 */

        String message = name + "을(를) 신규 메뉴 목록의 " + categoryCode + "번 카테고리에 "
                        + price + "원으로 등록하였습니다!!";
        model.addAttribute("message", message);

        return "first/messagePrinter";
    }

그런데, 위와 똑같은 기능을 하더라도
더 간단하게 @RequestParam을 이용하여 작성할 수 도 있다.

@RequestParam

request의 parameter로 넘어오는 값들의 key값과 일치하는 변수명을 작성하고
@RequestParam을 적용하면 알아서 값을 꺼내고,
(해당 매개변수의 자료형에 맞게)형변환도 해준다.

1. name

request parameter의 키 값과 다른 매개변수명을 사용하고 싶을 때 request parameter의 키 값을 작성한다.

@RequestParam(name="modifyPrice", defaultValue = "0")

2. defaultValue

사용자의 입력값이 없거나 아니면 request의 parameter 키 값과 일치하지 않는 매개변수 사용시 매개변수가 가질 기본 default 값을 작성한다.

3. 매개변수이름만 적는 경우

넘어온 parameter의 키값과 핸들러 메소드의 매개변수 이름이 같으면 @RequestParam를 생략 가능

@PostMapping("modify1")
    public String modify1(Model model,@RequestParam(name="name", defaultValue = "디폴트") String modifyName, int modifyPrice) {
    // modifyPrice : 넘어온 parameter의 키값과 핸들러 메소드의 매개변수 이름이 같으면 생략 가능

        /* 설명. 넘어온 데이터들로 update를 하고 성공했다는 가정 */

        String message = modifyName + "메뉴의 가격을 " + modifyPrice + "로 변경하였습니다.";
        model.addAttribute("message", message);

        return "first/messagePrinter";
    }

4. @RequestParam Map으로 받는 방법

//Map으로 받는 경우 HttpServletRequest처럼 다시 key값으로 각각 꺼내고 형변환도 따로 해줘야 한다.

@PostMapping("modify2")
    public String modify2(Model model, @RequestParam Map<String, String> parameterMap) {
        String modifyName = parameterMap.get("name");
        int modifyPrice = Integer.parseInt(parameterMap.get("modifyPrice"));

        String message = modifyName + "메뉴의 가격을 " + modifyPrice + "로 변경하였습니다.";
        model.addAttribute("message", message);

        return "first/messagePrinter";
    }

@ModelAttribute

핸들러 메소드에 우리가 작성한 클래스(bean말고)
매개변수로 작성하면
스프링이 객체를 만들어 주고(기본 생성자) setter로 값도 주입해 준다.

@PostMapping("search")
    public String searchMenu(@ModelAttribute(name="menu") MenuDTO menu) {
        System.out.println("menu = " + menu);

        return "first/searchResult";
    }

커맨드 객체

이러한 클래스의 객체를 '커맨드 객체'라고 부른다. (커맨드 객체는 기본생성자와 setter가 필수)

이후에 이 @ModelAttribute를 사용하면!

@ModelAttribute 어노테이션을 활용하면
커맨드 객체를 모델에 attribute로 담아주며
이후 view의 재료로 사용.

@ModelAttribute는 MenuDTO 객체를 자동으로 생성하고, 그 객체에 요청 파라미터 값을 바인딩한다.

로그인

1. HttpSession을 인자로 사용하는 방법

session.setAttribute

세션에 정보를 저장하기위해 setAttribute를 사용한다.

@GetMapping("login")
    public void login(){}

@PostMapping("login")
    public String sessionTest1(String id, String pwd, HttpSession session) {
        System.out.println("id = " + id);
        System.out.println("pwd = " + pwd);

        /* 설명. 로그인 성공을 가정(회원 조회 이후) HttpSession에 로그인 성공한 회원 정보 저장 */
        session.setAttribute("id", id);
        session.setAttribute("pwd", pwd);

        return "first/loginResult";
        }

또한 첨에 헷갈렸던 것은 왜 GetMapping과 PostMapping을 같은 url경로에 써도 되는지 이해가 안갔었는데, 생각해보면 Get은 url경로가 바뀌지 않기 때문에 get요청으로 로그인폼으로 화면이 바뀐다고 하더라도 url은 그대로이기 때문에 get과 post둘다 사용하여 로그인할 수 있다!

2. Model을 인자로 사용하는 방법

: Model에 담은 'id' 값을 HttpSession에 저장

 /* 설명. Model에 담은 값 중에 일부를 HttpSession에 자동으로 담도록 어노테이션 활용 */
    @PostMapping("login2")
    public String sessionTest2(Model model, String id) {
        model.addAttribute("id", id);

        return "first/loginResult";
    }

로그아웃

1. HttpSession 사용하는 방법

session.invalidate();

HttpSession을 사용한 경우에는, session을 무효화처리한다.

    @GetMapping("logout1")
    public String logoutTest1(HttpSession session) {
        session.invalidate();// 세션을 무효화하여 로그아웃 처리

        return "first/loginResult";
    }

2. SessionStatus 사용하는 방법

SessionStatus를 사용한경우에는 , setComplete()를 사용한다.

sessionStatus.setComplete();

    @GetMapping("logout2")
    public String logoutTest2(SessionStatus sessionStatus) {
        sessionStatus.setComplete();

        return "first/loginResult";
    }

body() 메소드

@PostMapping("body")
public void body(@RequestBody String body,
                 @RequestHeader("content-type") String contentType,
                 @CookieValue(value="JSESSIONID") String sessionId) {
    // 요청 본문, 헤더, 쿠키 값들을 출력
}

@RequestBody는 요청 본문(body)을 Java 객체로 바인딩하는 데 사용.
@RequestHeader는 요청 헤더에서 특정 값을 추출.
@CookieValue는 클라이언트가 보낸 쿠키에서 값 추출

profile
럭키헤일리

0개의 댓글