[spring] 컨트롤러/서비스/DAO , 웹페이지 매개변수 받는방식

2 분 소요

출저 및 참고 사이트 :
https://www.youtube.com/watch?v=9IiL5s0OPWM&t=38s&ab_channel=%EB%AA%B0%EC%9E%85%EC%BD%94%EB%94%A9

https://youtu.be/9IiL5s0OPWM


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

  • 서비스 계층의 빈을 생성한다.