본문 바로가기
Spring/Legacy

Controller in Legacy Package

by pms93 2022. 10. 18.
package com.ms.cf.member;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.ms.cf.HomeController;
import com.ms.cf.service.RegistService;

@Controller
public class MemberController {

	// '/'요청이 들어오게 되면 컴파일러는 web.xml을 읽어들이면서 servlet-mapping을 시작한다.
	// 위 동작이 실행되면서 DispatcherServlet은 servlet-context.xml을 읽어들이고 annotation-driven, base-package 설정에 따라 annotation과 component scan을 시작한다.
	// (* component-scan시에 읽어들여진 class들은 Autowired가 가능해진다.)
	// (* component - bean의 총괄 개념이며 Controller, Service, Repository 등이 있다.)
	// 이후 클라이언트 요청은 servlet-context.xml의 viewResolver객체의 설정에 따라 서버가 응답을 주게 된다. 
	@Autowired RegistService regSvc; // RegistService regSvc = new RegistService(); 와 동일
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	// RequestMapping의 속성이 value가 유일하다면 'value = '는 생략 가능하다.
	// value에 명시된 문자열과 return될 문자열이 동일하다면 return은 생략이 가능하다.
	// 별도의 데이터 전송방식(GET, POST)이 명시되어 있지 않으면 두 요청 모두 받아 처리한다.
	@RequestMapping("/index")
	public void index() {}
	/* 
	@RequestMapping("/index")
	public String index() {
		return "index";
		
		// 위 메서드와 동일한 동작을 한다.
	}
	*/
	
	@RequestMapping("/")
	public void logger(Locale locale) {
		// logger
		// - System.out.println(); 과 비슷한 개념이며 log를 남길 때 사용한다. 
		logger.info("Welcome home! The client locale is {}.", locale);
	}
	
	// Mapping 종류에 따라 메서드를 구분지을 수 있다.
	// GetMapping : GET요청만 처리
	// PostMapping : POST요청만 처리
	// 버전에 따라 Get, PostMapping은 동작하지 않을 수도 있다. (하위버전 해당)
	@GetMapping("login")
	public void login() { System.out.print("로그인 페이지 처리\n"); }
	
	@PostMapping("login")
	public String login(String id, String pw, Model model, RedirectAttributes ra) {
		// URL parameter name과 method parameter name이 동일하면 spring이 알아서 매칭해서 데이터를 넣어준다.
        // 단!! Model과 RedirectAttributes같은 경우 페이지 자체의 reloading이 일어나지 않는 이상 사용이 불가하다.( ex. ajax(비동기통신)시에 사용 불가)
		
		System.out.println("로그인 페이지에서 입력한 데이터를 받아서 처리");
		System.out.print("아이디 : " + id + "\n비밀번호 : " + pw + "\n");
		
		if (id.equals("admin") && pw.equals("1234")) {
			// return ,forward, redirect
			// * return
			// - 반환값과 일치한 jsp를 찾아가 해당 결과물을 client에게 준다.
			// * forward
			// - 반환값과 mapping의 value가 일치한 method를 찾아가 실행한다.
			//
			// * redirect (* redirect란, http프로토콜로 정해진 규칙으로 서버가 클라이언트에게 특정 url로 이동하라는 응답을 보내는 것을 의미한다.)
			// - server가 client에게 반환한 값을 client는 server에게 재요청하여 URL 이동을 하게끔 한다.
			// - redirect의 경우 각각의 요청이 실행될 때 마다 Client와 Server(WAS)간 새로운 요청이 생성되는 것이므로 항상 새로운 request, response객체가 생성된다는 특징이 있다.
			//   
			//
			// *주의 : return과 forward는 URL이동 요청이 아닌 반환값과 일치한 jsp의 결과물을 client에게 뿌려주는 개념이다.
			//       단 a tag 혹은 event로 인한 location.href 등 이로 인해 메서드가 실행된 경우는 URL이동 요청이 된다.
			
			// model
			// - model은 한단계의 client요청까지만 유효하다. (redirect후 혹은 다른 요청이 온 이후로는 사용 불가)
			// - redirect후에 특정 데이터를 유지할 필요가 있다면 RedirectAttributes 객체를 사용한다.
			// ex) RedirectAttributes ra
			//     ra.addFlashAttribute("attributeName", "attributeValue");
			
			
			
//			model.addAttribute("msg", "로그인 성공");
			ra.addFlashAttribute("msg", "로그인 성공ㅋㅋ");
//			return "index";
//			return "forward:index";
			return "redirect:index";
		}
		
		model.addAttribute("msg", "로그인 실패");
		return "login"; 
	}
	
	@GetMapping("register")
	public void register() {}
	
	@PostMapping("register")
	public String register(MemberDTO member, String confirmPw, Model model) { 
		if (!member.getPw().equals(confirmPw)) {
			model.addAttribute("msg", "입력하신 두 비밀번호가 다릅니다.");
			return "register";
		}
		
		regSvc.regist(member);
		return "redirect:index";
	}
	
//	@PostMapping("register")
//	public String register(MemberDTO member, String confirmPw, Model model, RedirectAttributes ra) {
//		if (!member.getPw().equals(confirmPw)) {
//			model.addAttribute("msg", "입력하신 두 비밀번호가 다릅니다.");
//			return "register";
//		}
//		
//		ra.addFlashAttribute("msg", "회원가입 성공");
//		System.out.println("아이디 : " + member.getId());
//		System.out.println("비밀번호 : " + member.getPw());
//		System.out.println("이름 : " + member.getName());
//		System.out.println("전화번호 : " + member.getMobile());
//		
//		return "redirect:index";
//	}
	
//	@PostMapping("register")
//	public String register(@RequestParam(value = "id") String i, 
//			@RequestParam(value = "pw") String p, 
//			@RequestParam(value = "name") String n, 
//			@RequestParam(value = "mobile") String m) {
//		
//		// @RequestParam(value = "tagName")
//		// - 매개변수명과 tag의 name이 일치하지 않으나 값을 넣어주고 싶은 경우 사용한다.
//		
//		return null;
//	}
	
//	@PostMapping("register")
//	public String register(HttpServletRequest req) {
//		String id = req.getParameter("id"), pw = req.getParameter("pw"), name = req.getParameter("name"), mobile = req.getParameter("mobile");
//		
//		// HttpServletRequest
//		// - jsp에서 사용했던 내장객체 request를 사용할 수 있게 해준다.
//		
//		return null;
//	}
	
	
	@RequestMapping("list")
	public void list(Model model) { model.addAttribute("memberList", regSvc.getMembers()); }
}

'Spring > Legacy' 카테고리의 다른 글

AJAX & JSON  (0) 2022.10.26
DAO(Repository) & Mapper.xml  (0) 2022.10.25
Spring <-> DB Connection  (0) 2022.10.25