[spring] 컨트롤러/서비스/DAO , 웹페이지 매개변수 받는방식
출저 및 참고 사이트 :
https://www.youtube.com/watch?v=9IiL5s0OPWM&t=38s&ab_channel=%EB%AA%B0%EC%9E%85%EC%BD%94%EB%94%A9
Controller, Service, DAO 계층 설명
Controller
- 역할 : 인포데스크 팀
- 하는 일 :
- 고객(브라우저)의 요청을 접수 후 적절한 서비스로 토스
- 서비스에서 받은 응답을 고객이 이해할 수 있는 형태로 변환 후 고객에게 전달 (응답)
- 인포데스크 직원이 무엇을 직접 처리하거나 하면안됨. 요청이 오면 실무진에게 전달만 해줘야함
- Request 매개변수를 Sevice 클래스 객체에게 전달한다. (직접 처리는 안함)
Service
- 역할 : 실무팀
- 하는 일 :
- 컨트롤에게서 받은 일을 처리한 후, 컨트롤러에게 응답
- 즉 기능, function, 로직, 메소드 등을 담당한다. 데이터 처리는 DAO에 위임
- 데이터를 가져오기, 삭제, 수정을 직접 하지 않고, DAO에게 위임한다.
DAO (Data Access Object)
- 역할 : DB와의 영업사원
- 하는 일 :
- 서비스의 요청을 받아서 데이터를 직접 처리하거나, 다른 DBMS에게 위임한 후 결과를 보고
- DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트
- DAO인터페이스와 인터페이스를 구현한 DAO클래스를 생성해줘야한다.
- Mapper인터페이스를 사용하지 않았을 때는 네임스페이스 + “.” + SQL ID로 지정해서 SQL을 호출해야한다.
- selectOne, insert, delete 등 제공하는 메소드를 사용해야 한다.
DAO 와 Mapper는 하는일은 같은데 다름. 현재 Study 프로젝트에서는 DAO 대신 Mapper로 사용한다.
MVC 동작 방식
- 동작 방식은 Contorller <-> Service <-> DAO <-> DB 형식으로 꼭 단계를 거치도록 해야된다.
- Contorller <-> DAO (x) , Controller -> DB (x)
@RequestParam / @RequestBody 차이점
@RequestParam
- JSON객체 못받음. URL의 매개변수를 받아옴
- 주로 URL으로 데이터 주고받을때 사용
- 데이터를 받을때, 데이터를 저장하는 이름으로 메소드 변수명을 설정해주어야 한다.
- 객체 생성 불가
- 각 변수별로 데이터 저장 가능
- 1개의 HTTP 요청 파라미터를 받기 위해서 사용한다.
- 필수 여부가 true 이기 때문에 반드시 해당 파라미터가 전송되어야 한다. (해당파라미터 미전송시 400 error)
- 필수 여부를 false 로 하려면 required=false 로 설정해주어야 한다.
@ModelAttribute
- JSON 객체 못받음, URL의 매개변수를 여러개 받아와서 객체 필드값에 넣음
- 주로 URL의 여러 파라미터를 1:1로 한꺼번에 받아와서 객체 필드값에 넣을떄 사용
@RequestBody
- JSON 객체를 받아와서 JSON 객체의 값을 매개변수로 활용
- 주로 JSON 객체를 주고 받을때 사용.
- 데이터를 받을때, 메소드 변수명 상관없다.
- 객체 생성 가능
- 각 변수별로 데이터 저장 불가
- 클라이언트가 전송하는 Json 형태의 HTTP Body 내용을 Java Object로 변환시켜주는 역할을 한다.
- Body가 존재하지 않는 Get 메소드에 @RequestBody를 활용하려고 하면 에러가 발생한다.
- @RequestBody로 받는 데이터는 Spring에서 관리하는 MessageConverter들 중 하나인 MappingJackson2HttpMessageConverte를 통해 Java 객체로 변환된다.
@RestController
public class StudyBoard {
// url = "/pets?petId=10"
// url = "/api주소?(매개변수로 받을변수)=value"
@GetMapping("/pets")
public String setUpForm(@RequestParam("petId") int petId){
return ""
}
// url = "/pet?petid=10&petname="test"&petage=5
// url = /api주소?(객체필드명1)=value&(객체필드명2)=value&...
@GetMapping("/pet")
public String setUpForm(@ModelAttribute Pet pet){
return ""
}
// url = "/pet"
// 매개변수를 JSON 객체로 받음
@GetMapping("/pet")
public String setUpForm(@RequestBody Pet pet){
return ""
}
// url = "/pets/10"
// url = "/api주소/(매개변수로 받을변수)"
@GetMapping("/pets/{petid}")
public String setUpForm(@PathVariable("petid") int petid){
return ""
}
}
스테레오 타입 어노테이션
- 디폴트로 적용되는 어노테이션을 스테레오타입 어노테이션이라 한다.
- @Component, @Controller, @Repository, @Service 넷다 똑같은 Compnent 기능을 갖고있지만, 이름이 달라서 쓰임 용도를 구별할수 있다.
- @Controller 는 컨트롤 클래스에 붙이고, @Service는 Service 클래스에 붙이는 형식. 둘다 같은 컴포넌트, 같은 기능인데 쓰임에 따라 각각의 어노테이션을 붙인다.
@Component
- Spring에서 관리되는 객체임을 표시하기 위해 사용하는 가장 기본적인 annotation이다.
- scan-auto-detection과 dependency injection을 사용하기 위해서 사용되는 가장 기본 어노테이션이다.
- @Component가 붙은 클래스는 빈 스캐너를 통해 자동으로 빈으로 등록된다.
- 빈의 아이디는 따로 지정하지 않으면 클래스 이름의 첫 글자를 소문자로 바꿔서 사용한다.
- 사용예시) @Component(“id”)
@Controller
- Web MVC 코드에 사용되는 어노테이션이다. @RequestMapping 어노테이션을 해당 어노테이션 밑에서만 사용할 수 있다.
- MVC에서 컨트롤러 역할을 하는 빈을 나타낸다.
@Repository
- data repository를 나타내는 어노테이션이다.
- @Repository는 플랫폼 특정 exception을 잡아 Spring의 unchecked exception으로 뱉어내준다. ( PersistenceExceptionTranslationPostProcessor )
- @Repository는 DAO관련된 빈만 생성한다.
@Service
- 서비스 계층의 빈을 생성한다.