+ 00 00 0000

Have any Questions?

01_Simple Coding – Backend – Controller 기초 – 기본 요약

01_Simple Coding – Backend – Controller 기초 – 기본 요약

📃 요약

실무에서는 MVC 디자인 패턴 속해서 스프링부트를 사용해 코딩을 진행함. 파일관리 시 파일을 용도에 맞게 정리하듯이 MVC 디자인 패턴도 패키지 및 클래스를 용도에 맞게 분류해서 코딩을 진행함

요소 기술 :

– Basic : java & spring boot

📃 기술 구현

스펙 :

- intellij
- java
- spring boot

📃 MVC 디자인 패턴

1. M : Model

- 정의     : Entity, Service, Repository(DAO), DTO 등을 사용하는 영역
- 역할     : 정보의 저장/검색이 목적인 순수 클래스
    1) Entity  : Value Object(정보 저장 목적) 와 유사, 정보저장이 목적인 클래스
                 속성(필드)/생성자/Setter/Getter 만 사용함
                 DB 테이블의 데이터를 객체에 저장함 (엔티티 == 테이블)
    2) Service : 업무 로직이 정의된 함수들이 있는 클래스
    3) Repository : 실제 DB 에 접속해서 CRUD 를 하는 함수들이 있는 클래스
    4) DTO     : Entity 의 속성을 가공(확장(속성의 개수 증가), 축소(개수 감소)) 할 목적으로 사용되는 클래스

2. V : View

- Frontend(클라이언트)의 화면을 의미하면 주로 Vue / React / JSP 등을 사용함
- 화면에 데이터를 표시하는 영역

3. C : Controller

- View 와 Service 를 연결해주는 역할을 담당하는 클래스
- View의 URL 를 통해서 화면과 연결되고 Service 의 결과를 다시 View 에게 전달함

📃 어노테이션 정의 :

- 주로 특별한 기능을 부여하기 위해 사용
- 클래스나 함수(메소드), 변수 위나 앞에 추가하여 사용함
- 자동 Setter/Getter 생성, 생성자 생성 등
- 장점 : 코드량이 감소하고, 유지보수가 쉬우며, 생산성이 증가함

📃 SSR vs CSR :

1. SSR

- SSR : Server Side Rendering
- html 파일을 서버에서 만들어서 웹브라우저로 전송해서 화면에 표시함
- 예) JSP, 타임리프 등

2. CSR

- CSR : Client Side Rendering
- html 파일을 최초 1회 전송하고 다음부터는 변경되는 데이터만 서버에서 받고, 나머지를 조립해서 웹브라우저에 화면에 표시함
- 예) React, Vue 등

📃 @Controller :

- View 가 JSP 일때 사용되는 컨트롤러
- 함수 위에 요청받은 특정 url 이 있음
- return 값은 요청을 처리한 결과 데이터를 Model 이라는 해쉬멥에 담고 jsp 페이지로 이동함(예 : index.jsp 등)

Model

- jsp 페이지로 이동될 때 전송할 데이터는 Model 이라는 객체에 넣어서 이동됨

컨트롤러 사용법

1) url 매개변수 없이 요청

사용법 : 
    @GetMapping("/url") // 요청받은 url
    public String 함수명(Model model) {
       실행문;

        return 이동될페이지명;
    }

예 :
        @GetMapping("/exam01/hello")
    public String Hello(Model model) {
        model.addAttribute("greeting2", "Springboot 처음이지");
        return "exam01/hello.jsp";
    }

2) @RequestParam :

- 쿼리스트링 방식으로 변수에 값을 저장해서 다른 페이지로 전달하는 어노테이션
    1) 쿼리스트링방식 형태 : /url?변수=값&변수2=값2...
- 매개변수가 전송되지 않으면 기본적으로 에러를 발생시킴
- 매개변수가 전송되지 않으면 기본값으로 대체해서 에러를 나타나지 않게 하는 옵션도 존재함(defaultValue)
사용법 : 
    public String 함수명(Model model, @RequestParam String 변수명){
            실행문;
            return 이동될페이지명;
        }

옵션 : defaultValue="대체값" : 쿼리스트링 변수에 값이 null 이면 "대체값" 바꿔줌

예 : 
url 테스트 : http://localhost:8000/exam02/hello-name?name=홍길동

    @GetMapping("/hello-name")
    public String HelloName(Model model
            ,@RequestParam(defaultValue="") String name) {
        model.addAttribute("greeting", "안녕하세요 "+ name);

        return "exam02/hello.jsp";
    }

3) @ModelAttribute :

- 객체의 속성명으로 jsp로 각각 전달
- 객체의 속성명 === url 매개변수명 일치하면 자동으로 데이터가 저장됨
사용법 : 
    @GetMapping("/url")
    public String 함수명(
            @ModelAttribute 클래스명 객체명){

        return 이동될페이지명;
    }

예 : 
 url 테스트 : http://localhost:8000/exam04/object-param?id=forbob&name=kang
    @GetMapping("/object-param")
    public String getObjectParam(
            @ModelAttribute Member member){

        return "exam04/object_param.jsp";
    }

4) @PathVariable :

- 파라메터 방식으로 변수에 값을 저장해서 다른 페이지로 전달하는 어노테이션
    1) /url/값
- 객체의 속성명 === url 매개변수명 일치하면 자동으로 데이터가 저장됨
사용법 : 
    @GetMapping("/url/{변수명}")
    public String getPathVariable(
            @PathVariable String 변수명,
            Model model){
            model.addAttribute("키이름", 변수명); // 값 저장
        return 이동될페이지명;
    }

url 테스트 : http://localhost:8000/exam05/path-variable/KangTaeGyung

예 : 
    @GetMapping("/path-variable/{name}")
    public String getPathVariable(
            @PathVariable String name,
            Model model){
            model.addAttribute("name", name);
        return "exam05/path_variable.jsp";
    }

5) ResponseEntity :

- 목적 : 프로그램 품질 향상을 위해 사용
- 프론트로 성공/실패 신호를 전송함
- 성공(신호) : HttpStatus.OK (200) : 200 ~ 400 사이 (거의 성공메세지)
- 실패(신호) : HttpStatus.NOT_FOUND (404) : 400 이상 (거의 실패메세지)
- 주로 예외처리와(try ~ catch) 함께 사용함
사용법 : 
   사용법 : new ResponseEntity<>(배열[객체], 신호);
   사용법 : new ResponseEntity<>(신호);

예 : 
    @PostMapping("/url")
    public ResponseEntity<Object>
            getObjectRequestBody(
                @RequestBody Member member
            ) {
        try {
            List<Member> list = new ArrayList<>();
            list.add(member);
            if(member != null) {
//              TODO: 성공 : OK(200)
                return new ResponseEntity<>(list, HttpStatus.OK);
            } else {
//              TODO: 0건 insert : NO_CONTENT(204)
                return new ResponseEntity<>(HttpStatus.NO_CONTENT);
            }
        } catch (Exception e) {
//          TODO: BAD_REQUEST(400)
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
    }

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다