Developer Note/국비과정 수업내용 정리&저장

24년 11월 11일

DH_PARK 2024. 11. 21. 02:27

스프링 시작

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