스프링 시작
lombok : 자동으로 getter , setter , toString 등 다양한 코드를 자동완성 시켜주는 라이브러리
@Data //getter,setter , toString 을 자동완성 시켜준다
@Builder //빌더 패턴을 적용시켜준다
@NoArgsConstructor //기본 생성자 자동생성
@AllArgsConstructor //매개변수 생성자 자동생성
public class PersonDto {
private String name;
private int age;
private String addr;
여기서 빌더패턴이란 , 매개변수 생성자는 순서에 맞게 무조건 객체를 만들어야 하는데 이게 나중에 코드가 많아지면 순서가 헷갈릴수도 있고 몇개를 안써서 오버로딩을 해야할 때도 있는데 빌더패턴을 사용하면 개발자 마음대로 순서와 개수를 정의해서 객체를 생성할 수 있다.
mock 이란 ?
테스트 시 간단하게 사용하는 가짜 객체를 만들어서 사용하는 기술
프레임워크나 라이브러리는 아니고 개념이 일종이다.
(근데 Mockito 라는 라이브러리가 있긴 함)
데이터베이스와 실제 연결 없이 DAO 단위 테스트 같은것을 할 때 사용한다.
각 어노테이션의 기능들
- RequestMapping : 요청에 대한 url 을 매핑하는 어노테이션
- RequestParam : 요청시 전달하는 값을 매개변수로 매핑할 때 사용하는 어노테이션
- 주로 쿼리스트링이나 form 데이터를 처리할 때 사용함
- RequestBody : 클라이언트 요청을 json형태 → java 오브젝트로 변환함
- { “name” : “john” } 이라는 형태의 데이터를 요청하면 자바에서 john을 변환해서 돌려준다
- ModelAttribute : 요청 파라미터를 자바 객체에 바인딩한다.
- RequestParam과 비슷하다
※ModelAttribute와 RequestParam의 차이 ?
둘은 요청값을 파라미터로 보내는건 비슷한데 처리단위와 방식의 차이가 약간 있다.
param은 개별 값으로 컨트롤러 메서드에 매개변수로 주입되고
model 은 객체형태로 데이터를 주입하여 form데이터 같은 복잡한 구조에 자주 처리된다고 한다.
그 전에 값을 할당하기 위해서는 getter 와 setter 를 선언해주어야 한다!
(필수.. 라고는 말할 수 없지만 캡슐화를 유지하고 코드 가독성,유지보수를 위해 이런 방식이 권장된다.)
lombok을 사용해서 @data 하나만 붙여주면 끝나긴 해 ㅋㅋ
@RequestMapping(value="/p01",method=RequestMethod.GET)
public void p01(@RequestParam(value="name", required=false) String name) {
log.info("GET /param/p01..." + name);
}
RequestMethod를 get으로 지정해줄 수 있다.
required=false는 해당 매개변수가 필수인지 아닌지를 설정.
false라면 파라미터가 요청에 포함되지 않아도 컨트롤러 메서드가 실행은 된다.
반대로 true면 파라미터가 반드시 포함되어야 하는데 없이 요청을 보내면 스프링에서 400 에러를 반환하게 된다.
※ false와 함께 기본값을 설정해줄 수도 있다 !
public void(@RequestParam(value="name",required=false,defaultValue="guest") String name){
System.out.println(name);
//name에 값 없이 요청을 보내면 기본값인 guest 가 요청값에 할당된다.
- true : 파라미터가 필수 사항일 때 사용
- 특정 검색이나 회원가입시 빈칸에 정보를 반드시 입력해야할 때. 아니면 에러메시지를 보냄
- false : 선택사항일 때 사용
- 사용자 이름을 출력할 때 없다면 기본값으로 출력하거나 하는식으로 사용한다
Model 객체
전에 하던 서블릿 수업에서는 파라미터 요청값을 보통 request나 session 객체에 정보를 담아서 jsp 에 넘겨주었다.
근데 Spring 에서는 Model 이라는 객체를 사용한다.
request.setAttribute와 비슷한 역할이라고 함.
@GetMapping("/page2")
public String page2(PersonDto dto, Model model) {
log.info("get/param/page1..." + dto);
model.addAttribute("dto", dto);
model.addAttribute("test", "test_value2");
return "param/page1";
// 포워딩 위치: /WEB-INF/views/param/page1.jsp
}
요청에서 전달된 데이터는 PersonDto 에 매핑된다. 예: GET /page2?name=Jane&age=30&addr=Busan → PersonDto{name=Jane, age=30, addr=Busan}
그리고 Model 객체에 데이터를 추가한다.
이게 전에 하던 request.setAttribute 와 거의 똑같다고 보면 된다. (물론 뭐 파고 들면 약간은 다르겠지)
그리고 리턴에서 param/page1 을 반환하므로 스프링이 이 정보를 가지고 page1 으로 포워딩 처리를 하게 해준다.
@GetMapping("/page3/{name}/{age}/{addr}")
이런 식으로 파라미터를 지정해주면 url 에
GET /page3/John/25/Seoul
이런식으로 파라미터만 입력해주면 메서드가 동작한다.
ModelAndView
@GetMapping("/page4/{name}/{age}/{addr}")
public ModelAndView page4(PersonDto dto) {
log.info("get/param/page4..." +dto);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("dto", dto);
modelAndView.addObject("test", "test_value_4");
modelAndView.setViewName("param/page1");
//포워딩 위치 : /WEB-INF/views/param/page1.jsp
return modelAndView; //이것도 일종의 forwarding 처리
}
Model 객체와 비슷하지만 여기에 View까지 합쳐놓은 ModelAndView 객체이다.
요소추가는 addObject메서드를 사용한다.
setViewName은 값을 보낼 view 페이지 이름을 지정하는 메서드이다. (포워딩처리 할 페이지 명)
Forwarding처리
//포워딩
@GetMapping("/forward1")
public String f1(Model model) { //model 은 request 를 가지고 있다 ?
model.addAttribute("f1","f1Value");
log.info("param/forward");
return "forward:/param/forward2"; //forward 2 로가고
}
@GetMapping("/forward2")
public String f2(Model model) { //model 은 request 를 가지고 있다 ?
model.addAttribute("f2","f2Value");
log.info("param/forward2");
return "forward:/param/forward3"; //3으로 가고
}
@GetMapping("/forward3")
public String f3(Model model) { //model 은 request 를 가지고 있다 ?
model.addAttribute("f3","f3Value");
log.info("param/forward3");
return "param/forward_result"; //최종적으로 result 까지
}
forward1 으로 요청이 들어오면 model 객체에 문자열 속성을 담아 forward2 로 포워딩 처리
→ 요청을 받은 forward2 에서 또 model 객체에 f2 key 값을 가진 문자열을 담아 3으로 보내고
3에서 최종 페이지로 최종 포워딩처리를 한다.
리다이렉팅
@GetMapping("/redirect1")
public String r1(Model model,RedirectAttributes redirectAttributes) { //데이터를 담는 model 객체
log.info("/param/redirect...");
// model.addAttribute("r1","r1Value"); //쿼리스트링으로 속성 전달(파라미터)
redirectAttributes.addAttribute("r1","r1Value");
redirectAttributes.addFlashAttribute("r1_flush","r1_flush_value"); //세션 객체에 속성으로 들어감,세션에 저장
return "redirect:/param/redirect2";
}
@GetMapping("/redirect2")
public String r2(String r1,@ModelAttribute("r1_flush") String r1_flush,RedirectAttributes redirectAttributes) {
log.info("/param/redirect...");
// model.addAttribute("r1","r1Value"); //쿼리스트링으로 속성 전달(파라미터)
redirectAttributes.addAttribute("r1", r1);
redirectAttributes.addAttribute("r2","r2Value");
redirectAttributes.addFlashAttribute("r1_flush",r1_flush);
redirectAttributes.addFlashAttribute("r2_flush","r2_flush_value"); //세션 객체에 속성으로 들어감
return "redirect:/param/redirect_result";
}
redirect1 으로 get 요청이 들어오면 redirectAttributes 객체에 문자열을 담아
redirec2 로 리다이렉팅을 한다.
addFlashAttribute , addAttribute 두 메서드의 차이는 ?
addAttribute 는 쿼리스트링으로 리다이렉트 URL 에 데이터가 포함되기 때문에 주소창에서 데이터를 확인가능.
addFlashAttribute 는 플래시 라고 하는 스코프에 전달되는데 이 플래시 스코프는 세션을 임시로 사용하여
리다이렉트 시키고 한번 데이터를 전달하여 사용되면 자동으로 제거가 된다.
마찬가지로 세션으로 전달되기 때문에 URL 에 데이터가 표시되지 않는다.
※ 플래시 데이터와 세션데이터는 다른거라고 함 !
플래시는 세션을 임시로 사용하는거임 !
이렇게 정리를 하긴 했지만 솔직히 잘 와닿지 않는다.
뭔가 애매하게 감이 살짝 안오는 느낌.. ?
'Developer Note > 국비과정 수업내용 정리&저장' 카테고리의 다른 글
24년 11월 13일 (0) | 2024.11.24 |
---|---|
24년 11월 12일 (0) | 2024.11.22 |
24년 11월 08일 (2) | 2024.11.21 |
24년 11월 06일 (0) | 2024.11.20 |
24년 11월 7일 (0) | 2024.11.19 |