@RequestMapping

HTTP 요청과 해당 요청을 처리할 메서드를 매핑하는 역할

@RestController
// value 통합
@RequestMapping("api/v1/main")
public class MainControllerApiV1 {

    // value 위에서 설정했기 때문에 생략 가능
    @GetMapping
    // @RequestMapping(method = RequestMethod.GET, value = "/api/v1/main")
    public void getMainData() {
    
    }
    
    @PostMapping
    // @RequestMapping(method = RequestMethod.Post, value = "/api/v1/main")
    // json데이터를 dto 형식으로 알아서 바꿔줌
    public ResponseDTO<Object> postMainData(@RequestBody ReqInsertMainDTO ReqInsertMainDTO) {
        mainService.postMainData(ReqInsertMainDTO);

        return ResponseDTO
                .builder()
                .code(0)
                .message("region 등록에 성공했습니다")
                .build();
    }

    @DeleteMapping("/{regionId}")
    // @RequestMapping(method = RequestMethod.DELETE, value = "/api/v1/main/{regionId}")
    public ResponseDTO<Object> deleteMainData(@PathVariable Integer regionId){
        mainService.deleteMainData(regionId);

        return ResponseDTO
                .builder()
                .code(0)
                .message("region 삭제에 성공했습니다")
                .build();
    }
    
    @PutMapping("/{regionId}")
    // @RequestMapping(method = RequestMethod.PUT, value = "/api/v1/main/{reigionId}")
    public ResponseDTO<Object> updateMainData(
        @PathVariable Integer regionId,
        @RequestBody ReqUpdateMainDTO reqUpdateMainDTO){
        
        mainService.updateMainData(regionId, reqUpdateMainDTO);
        
        return ResponseDTO
                .builder()
                .code(0)
                .message("region 수정에 성공했습니다")
                .build();
    }

HttpEntity

HTTP 요청과 응답을 보낼 때, 헤더와 바디에 데이터를 추가하고 조작하기 위해 사용

RequestEntity

요청의 헤더와 바디 조작

ResponseEntity

응답의 헤더와 바디 조작

Http 요청과 응답, 헤더와 바디

HTTP 요청 헤더 (HTTP Request Header):

HTTP 요청 헤더는 클라이언트가 서버로 보내는 요청 메시지에 포함되는 정보들을 담고 있습니다.
헤더는 요청의 메타데이터를 제공하며, 클라이언트가 서버에게 전달하는 요청에 대한 추가 정보를 담고 있습니다.
일반적으로 헤더에는 다음과 같은 정보들이 포함됩니다:

  • Host: 요청을 받을 서버의 호스트 이름과 포트 번호
  • User-Agent: 요청을 보내는 클라이언트의 소프트웨어 정보
  • Content-Type: 요청 바디의 데이터 타입 (주로 POST 요청에서 사용)
  • Authorization: 인증 정보 (인증이 필요한 리소스에 접근할 때 사용)
  • Cookie: 서버에서 설정한 쿠키 정보

HTTP 요청 바디 (HTTP Request Body):

HTTP 요청 바디는 클라이언트가 서버로 보내는 실제 데이터를 담고 있습니다.
일반적으로 GET 요청에서는 바디를 사용하지 않고, POST, PUT, DELETE 등의 요청에서 데이터를 바디에 담아 전송합니다.
바디에는 클라이언트가 서버로 전송하고자 하는 데이터가 포함됩니다. 주로 JSON, XML, 폼 데이터 등의 형식으로 데이터를 전송합니다.

HTTP 응답 헤더 (HTTP Response Header):

HTTP 응답 헤더는 서버가 클라이언트에게 보내는 응답 메시지에 포함되는 정보들을 담고 있습니다.
헤더는 응답의 메타데이터를 제공하며, 서버가 클라이언트에게 전달하는 응답에 대한 추가 정보를 담고 있습니다.
일반적으로 헤더에는 다음과 같은 정보들이 포함됩니다:
Content-Type: 응답 바디의 데이터 타입
Content-Length: 응답 바디의 길이
Set-Cookie: 클라이언트에게 전달할 쿠키 정보

HTTP 응답 바디 (HTTP Response Body):

HTTP 응답 바디는 서버가 클라이언트에게 보내는 실제 데이터를 담고 있습니다.
응답 바디에는 서버가 클라이언트에게 전송하고자 하는 데이터가 포함됩니다. 주로 JSON, XML, HTML 등의 형식으로 데이터를 전송합니다.

실습 코드

package com.example.hr1.domain.temp;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("api/v1/temp")
public class TempControllerApiV1 {
    
    @GetMapping("/200")
    public ResponseEntity<?> get200(){

        return new ResponseEntity<>("성공", HttpStatus.OK);

    }

    @GetMapping("/400")
    public ResponseEntity<?> get400(){

        return new ResponseEntity<>("유효하지 않거나 없는 인증 정보", HttpStatus.BAD_REQUEST);

    }

    // 401
    @GetMapping("/401")
    public ResponseEntity<?> get401(){

        return new ResponseEntity<>("인가되지 않은 요청", HttpStatus.UNAUTHORIZED);

    }

    // 403
    @GetMapping("/403")
    public ResponseEntity<?> get403(){

        return new ResponseEntity<>("인증되지 않은 요청", HttpStatus.FORBIDDEN);

    }

    // 404
    @GetMapping("/404")
    public ResponseEntity<?> get404(){

        return new ResponseEntity<>("NOT FOUND", HttpStatus.NOT_FOUND);

    }

    // 405
    @GetMapping("/405")
    public ResponseEntity<?> get405(){

        return new ResponseEntity<>("HTTP 메소드 오류 ", HttpStatus.METHOD_NOT_ALLOWED);

    }

    // 500
    @GetMapping("/500")
    public ResponseEntity<?> get500(){

        return new ResponseEntity<>("내부 서버 오류", HttpStatus.INTERNAL_SERVER_ERROR);

    }

}

Session

서버에서 내 정보를 저장하는 공간
사용자가 브라우저를 닫아 서버와의 연결을 끝내는 시점까지

  • HTTP는 Stateless,
    Session을 사용해서 임시 Stateful상태로 만드는 것

JSESSIONID

Java 웹 애플리케이션에서 세션을 구별하기 위해 사용되는 쿠키의 이름
클라이언트가 서버에 접속할 때, 서버가 해당 클라이언트에게 고유한 세션 ID인 'JSESSIONID'를 발급

실습 코드

// 세션 값 설정
public ModelAndView mainPage(HttpServletRequest request){

        HttpSession session = request.getSession();
        session.setAttribute("name", "hong");
}
// 세션 값 받아오기
public ModelAndView mainUpdatePage(@PathVariable Integer regionId, HttpServletRequest request){
        HttpSession session = request.getSession();
        System.out.println(session.getAttribute("name"));
}

jpa로 테이블 만들기

DB 자동 생성 두가지 방법

1.

ddl-auto: create
엔티티 먼저 만들고 테이블 만들어지면
ddl-auto : none

  • column 순서 맞추기
    DBeaver에서 ddl 수정, 테이블 삭제 후 쿼리 날리기
    or 후에 DB 프로그램에서 순서 맞춰주기

문제 :
테스트 시 데이터를 항상 같은 조건으로 두고 싶은데 데이터가 계속 쌓여 직접 삭제 후 다시 테스트해야함.
ex) sample 아이디 만들어서 테스트 했는데 db에서 삭제한 다음 다시 만들어야 함

해결 :
따로 resource에 sql폴더 만든 후, sql문 작성하여 쿼리를 날려줌

sql

// schema.sql
DROP TABLE IF EXISTS `post`;
DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `idx` int(11) NOT NULL AUTO_INCREMENT,
  `id` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY (`idx`)
);

CREATE TABLE `post` (
  `idx` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `content` varchar(255) NOT NULL,
  `user_idx` int(11) NOT NULL,
  PRIMARY KEY (`idx`),
  KEY `FK8fepup8sn6kmveiiffdcab7sc` (`user_idx`),
  CONSTRAINT `FK8fepup8sn6kmveiiffdcab7sc` FOREIGN KEY (`user_idx`) REFERENCES `user` (`idx`)
);

// data.sql
INSERT INTO `user` (idx, id, password)
VALUES(1, 'asdf', '123'),
      (2, 'sample', '1234');

INSERT INTO post (idx, title, content, user_idx)
VALUES(1, '첫번째', '안녕하세요', 1),
    (2, '두번째', '반갑습니다', 1),
    (3, '세번째', '뉴비입니다', 2);

yml

# application.yml
sql:
    init:
      encoding: UTF-8
      schema-locations: classpath:sql/schema.sql
      mode: always

@JoinColumn - 외래키 설정
@OneToMany - 1:N 매핑
@ManyToOne - N:1 매핑


컨트롤러 vs 레스트 컨트롤러

컨트롤러

리파지토리 - 서비스 - 컨트롤러 - 화면

클라이언트에 보내야 될 것

  • 화면

컨트롤러가 서비스에서 받을 것 (DTO)

  • 데이터

레스트 컨트롤러

리파지토리 -서비스 - 레스트 컨트롤러 - 데이터

클라이언트에 보내야 될 것

  • 상태코드
  • 메세지
  • 데이터

레스트 컨트롤러가 서비스에서 받을 것 (ResponseEntity)

  • 상태코드
  • 메세지
  • 데이터
    ResMainApiDTO - 보내고 싶은 데이터
    HttpStatus.OK - 보내고 싶은 상태 코드
return new ResponseEntity<>(
            ResponseDTO.builder()
            .code(0)
            .message("유저 리스트 조회 성공")
            .data(ResMainApiDTO.of(userEntityList))
            .build(),
            HttpStatus.OK
        );
profile
유승한

0개의 댓글