Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원/9월

22.09.09 - [ Spring ] bean등록 , ViewResolver , 요청 방식에 따라 처리하기, 파라미터 받기 , 데이터 담기 , interface 타입으로 받기

giggs 2022. 9. 15. 11:51

 

 

 

-- INDEX --

 

 

1. bean 등록 2. ViewResolver 3. 요청 처리 방식 4. 데이터 받기 5. 데이터 담기 6. 상위타입받기
@annotation
.xml
@bean
prefix
suffix
(value, method)
@GetMapping
@PostMapping
Request로 받기
변수로 받기
객체로 받기
Request에 담기
Model에 담기
Interface

 

 

 


 

 

 

 

1. bean 등록하기

 

 

1-1 : bean 등록하는 방법

  1. @annotation
  2. .xml

 

 

어노테이션으로 하는 방법이 쉽지만.

어노테이션으로 bean 만드는 것은 

클래스 위에 / 메서드위에 /필드위에 작성해 주어야 했다.

, class파일안에 작성했어야 했다..

 

 


 

 

1-2 : BUT. 예를 들어 SqlSession 얻어오려면?

  • 우리가 만든 클래스 파일이 아니고, 
  • 이미 만들어진 jar파일 가져다 사용하는 경우에는 수정할 수 없다. = 어노테이션 붙일 수가 없다.
  • 해당 클래스 파일에서 수정할 수 없으니 xml문서를 가지고 동적으로 자바 코드를 만드는 작업 해주어야 한다.
  • <bean class=“” SqlSession =“” ~~ >

 

 

 

 

 

 

 

 

+@ 추가된 방법 1가지 

  • @Bean 어노테이션을가지고 – 자바 코드로도 작업이 가능하게 해 주었다 
  • xml파일로 bean 등록하는 과정을 워낙 어려워하고 요구가 많아져서 생겼다.
  • 이 과정도 쉽지는 않다고 하심.

 

 

 

 

 


 

 

 

 

 

2. ViewResolver

 

 

 

return "board/write"만 해줬는데

어떻게 해당 경로를 찾아서 화면이 보이는지?

 

 

 

 

 


 

 

# return 값이 무엇인지 – 어떻게 돌아가는지 알아보자

 

 

2-1 : 클라이언트가 요청을 보내게 되면은 – DS이 요청을 잡는다. - 요청 url에 맞춰 해당 컨트롤러 호출

 

 

 


 

 

2-2 : 요청을 처리한 후 ㅡ DS는 응답을 해줘야 하는데 뭘로 해주나?

  • 요청 url인 write는 컨트롤러에게 줘버렸다
  • ( 정확히는 컨트롤러 안에 있는 method에게 = @RequestMapping된 메서드에게 )

 

 


 

 

2-3 : ViewResolver가 넘겨준 값으로 응답해준다.

  • 컨트롤러는 작업이 끝난 후 어떤 문자열을 Dispatcher Servlet에게 전달하고
  • Dispatcher Servlet는 전달받은 문자열을 ViewResolver에게 전달
  • ViewResolver에서 어떤 작업을 진행한 뒤 - 그 문자열을 DS에게 return
  • DS는 ViewResolver로부터 전달받은 값으로 화면을 선택 - 클라이언트에 전달

 

 

 

 


 

 

2-4 : ViewResolver는 어떤 작업을 해서 DS에게 전달해 주는가?

  • ViewResolver 가 어떻게 작동하는지 어떤 내용이 있는지 보고 싶으면 종속되어있는 DS 설정 파일을 보면 된다.
  • DS 설정 파일 = servlet-context.xml 파일
  • 스프링 context 안에 있는 객체를 이제 bean이라고 할 것이다.

 

 

 

 

#초록색

  • 어떤 bean(객체)를 만들 것이다 – 어떤 객체? viewResolver 클래스를 이용해 만든 객체

 

 

#보라색

  • property 는 setter 호출하는 것이다. - prefix라는 변수에 /Web-INF/views를 대입 – suffix변수에 .jsp 값 대입

 

 


 

 

#이것을 알았으면 ViewResolver가 하는 작업 체크

  • DS에게 전달받은 값 ( 문자열 )을 가지고
  • prefix + 문자열 + suffix 작업을 해준다.
  • [ prefix+문자열 + suffix ] 해준 값으로 DS(디스패쳐서블릿) 에게 전달한다!

 

 

 

 

 


 

 

 

2-5 : 스프링에서 --- 리다이렉트 하는 법

  • ViewResolver의 prefix / suffix 처리 받지 않도록 해주는 법
  • redirect 하는 것이라고 알려주기
  • return "redirect:/";

 

 

 

 

 

[ return = " / "; ] 만 해주면

return 값이 ViewResolver에게 전달되어서

  prefix 값과 suffix 값이 앞뒤로 붙어서 처리된다.

 

 

prefix와 suffix 처리되지 않도록 해주기 위해서는

redirect 하는 거라고

 

 

 

 

 

 

 

 

 


 

 

 

 

 

3. 메서드 요청 방식에 따라 처리하기 ( 겟방식, 포스트방식 )

  • doGet() , doPost() 했던 것처럼 처리하기

 

 

 

3-1 : @RequestMapping

 

 

 

여러 가지 요청에 대해서 요청마다

새로운 클래스(컨트롤러)를 생성해서 처리하는 것이 아니라

 

 

하나의 컨트롤러에서

들어오는 요청에 매핑되어서 처리하는 메서드만 여러 개 만들어서 사용 가능하다.

 

 

HOW ? 

메서드에 @RequestMapping 하는 방식으로 사용하기 때문에!

 

 

 


 

 

3-2 : 클래스(컨트롤러)에 공통 url 지정 가능

  • 클래스에 @RequestMapping() 적용하여서
  • 메서드에 @RequestMapping() 처리 시 공통으로 들어가는 url = /board를 지정해 놓을 수 있다.
  • 즉, BoardController에서는 /board 라는 url 이 모든 메서드에 공통으로 들어갈 텐데
  • 공통url을 등록해 놓을 수 있다.-  등록해놓으면 메서드 부분에서는 /board 생략 가능

 

 

 

 

  • 공통url 지정해 놓으면 - /board 없애도 잘 작동한다.
  • + board앞에 / [ 슬래쉬 ] 없애도 잘 작동한다.
  • + write 앞에 / 없애도 잘 작동한다.

 

 


 

 

3-3 : get요청 처리의 정석 방식과 @GetMapping 

  • @RequestMapping에서
  • 파라미터를 value만 전달해주는 경우에는 굳이 value 명시해서 사용해줄 필요 없다.
  • ( 1개의 값만 넣어주는 경우에는 value값으로 처리된다. )
  • 여러 개의 파라미터를 사용하는 경우에는 value=" " 명시해주어야 한다.

 

 

 


 

 

( 현재 스프링 프레임워크 최신 버전으로 설정하기 전 )

스프링 버전 설정 끝나면@GetMapping 사용 가능

@Getmapping 통해서 method부분 없앨 수 있다 = value 파라미터만 전달해주면 된다. = /write만써도된다

 

 

 

 

 

 

 

 


 

 

 

 

 

4. 사용자가 입력한 데이터 가져오기

  • 스프링에서 파라미터 데이터 가져오기

 

 


 

 

4-1 :  메서드 파라미터로 HttpServletRequest 객체 받아서 가져오기

  • 서블릿과 똑같이 getParameter로 가져오기
  • 요청을 처리하는 메서드의 파라미터로 HttpServletRequest  req 추가
  • DS가 해당 메서드 호출할 때 파라미터 타입(HttpServletRequest)에 맞춰서 req객체 넣어준다.
  • 해당 객체로 파라미터 값 가져오기 - req.getParameter(" ")

 

 

 


 

4-2 : 메서드 파라미터 변수로 가져오기

  • 요청을 처리하는 메서드의 파라미터로 -  변수 넣어주기
  • 결국 하려는 일이 – getParameter 해오고 – 변수에 담고 – 변수를 이용해서 vo를 만드는 것이다.
  • 메서드의 파라미터로 변수를 받아오게 해 주면 – Spring이 알아서 변수에 값을 넣어준다.! 
  • req 객체를 넣어주었듯이 변수에 값을 넣어준다.

 


 

# 조건

  • 클라이언트에서 넘어오는 name값과
  • 서버측(컨트롤러)에서 받아주는 변수명이 같을 때에만 받아준다!

 

 

 


 

# 정석

  • 정석은 @RequestParam 어노테이션이 붙어있어야지-
  • Spring이 이거는 클라이언트 쪽에서 넘어오는 name값으로 – getParameter하라는 거구나 판단하고 채워주는 것이다.
  • 생략하고 간편하게 사용해도 괜찮다..

 

 

 

다만 파라미터에 대한 옵션을 설정해줄 때에는 어노테이션 사용해주어야 한다..

어떤 옵션?

title의 값이 없을 때 출력될 defalut값 지정 같은 옵션

 

 

 

 


 

 

4-3 : 메서드 파라미터 객체로 가져오기

  • 클라이언트가 입력한 데이터를 받아오는 이유는
  • getParameter 해오고 – 변수에 담고 – 변수를 이용해서 vo를 만드는 것이다.
  • 파라미터에 이렇게 객체만 써주면
  • 해당 객체 찾아가서 필드 값을 매칭 해서 자동으로 채워준다!

 

 

 


 

# 조건

  • 클라이언트에서 넘어오는 name값과
  • 서버측(컨트롤러)에서 받아주는 BoardVo 객체의 필드명이 같아야 한다.

 

 

 

+ 받는 파라미터가 다르므로 똑같은 이름의 메서드 사용 가능

 

 

 

 

 

 


 

 

 

 

 

5. 포워딩 전에 - 요청 처리 결과 담기

 

 

 

5-1 : 파라미터에 HttpServletRequest req 객체 받아서 req.setAttribute()해서 담은 뒤 포워딩

 

 


 

5-2 : Model 객체 이용해서 담은 뒤 포워딩

 

 

springframework의 Model 이용

 

 


 

 

.addAttribute() 메서드 이용

 

 


 

 

key, value 형태로 담아서 보내주기

 

 


 

 

화면에서 확인

 

 

 


 

새로운 저장소는 아니고

request 에 있는 map같은 거라고 보시면됩니다.

Spring에서 request대신에

model이라는 곳에 담아라 이런 느낌으로 만든 애다..

 

 

 

 

 

 


 

 

 

 

6. 상위 타입인 Interface 로 객체 받기

 

 

 

# 컨트롤러 객체가 태어나기 위해서는 서비스 객체를 필요로 하고 있고

서비스 객체가 태어나기 위해서는 dao객체를 필요로 하고 있다.

 

 

 

# 이 상황에서 "서비스객체"가 "서비스22" 객체로 변경된다면?

  • 객체를 생성하는 곳, 받아주는 곳 뿐만아니라 메서드명이 바뀌었다면 메서드명까지 수정이 필요하다.
  • 이런 것을 방지하기 위해 상위 타입인 인터페이스를 만들어서 구현하도록 해 주고
  • 생성된 객체는 상위 타입인 Interface 타입으로 받아주기로 하였다.

 

 

 

 

앞으로 서비스 객체 자리에 들어올 객체는 

MemberService 인터페이스를 상속받아 구현한 애만 올 것이니까 받아줄 수 있다.

 

 

마찬가지로 dao객체 자리에 들어올 객체도

MemberDao 인터페이스를 상속받아 구현한애만 올것이니까 받아줄 수 있다.

 

 

메서드 명도 인터페이스에서 정해져 있으므로 동일하다. = 수정 작업 필요 없다.

 

 


 

 

6-1 : new interface - MemberService 

 

 

 

 

 

MemberService 타입으로 변경!

그럼 이제

컨트롤러가 태어날 때 필요한 인터페이스에

파란 객체가 오던 / 주황 객체가 오던

 

수정 작업 필요 없이 받아 줄 수 있다.

 

 


 

6-2 : 상위 타입인 인터페이스로 객체 받아주기

  • 서비스 객체를 필요로 하는 컨트롤러 부분에서 상위 타입인 인터페이스로 객체 받아주기
  • 이렇게 되면 어떤 서비스 객체가 오더라도 받아 줄 수 있다. 
  • 서비스 객체가 변경되더라도 컨트롤러 부분에서는 수정할 작업 없다.

 

 

 

 


 

6-3 : 서비스 부분에서도 같은 작업 해주기

  • new interface - MemberDao
  • 상위 타입인 MemberDao 로 dao 객체 받기

 

 

 

 


 

 

# 체크

  • 어노테이션은 인터페이스가 아닌 – 인터페이스를 구현한 클래스에 달아주기
  • 인터페이스로는 객체를 만들 수 없다.