
학교 프로젝트를 진행하면서 처음 spring boot를 공부하고 있으면서 어려워 하는 부분에 대해서 제대로 이해하고자 기록을 남기려 한다.
spirng에 대해서는 나중에 관계 파악이 완벽하게 된다면 정리 본을 올려보려고 한다. 우선 여기서 말하고자 하는 내용은 api 작성법에 대해서 알아야 할 것이 있다.
나의 프로젝트에서 구현해야 하는 기능은 간단하게 말하면 프론트에서 post 요청을 하면 데이터 베이스에 저장하고 저장한 것을 반환하는 것이 필요하다.
하지만 프로젝트에서 고려해야 할 점은 조금 까다로웠다.
프론트 사용자가 요청하는 데이터를 처리할 때 데이터는 post할 때 하나의 데이터 터플 값이 아닌 여러개가 동시에 들어오는데 이 때 같은 사용자가 여러개의 식품을 먹었고 이를 나중이 이를 구분하기 위함이 필요하다.(즉 사용자는 동일하고 각 여러개의 식품을 먹을 때의 정보가 들어가야 하는 구조이다.)

(지금의 과정은 이미 진행하여 완성하고 이후의 부족한 부분에 대해서 공부를 하는 과정이다.)
그래서 여기서는 userId,date를 주키로 하며 각 다른 테이블과는 참조하지 않게 하였고 다른 키가 이미 존재하니까 같은 것이어도 생성이 되고 구분이 되게 진행할 수 있었다.
그래서 이때의 post 요청 뿐만 아니라 API에 대해서 조금 헷갈려서 복습하려고 한다.
@RestController
@RequsetMapping("/api/v1/get-api")
public class GetController{
}
이런식으로 처음에 RestController과 RequestMapping을 붙여 내부에 선언되는 메서드에서 사용할 공통 url을 설정한다. 이때 url은 나중에 postman이라는 플랫폼을 통하여 어떻게 작동되는지 알 수 있는데 여기에 우리가 주소로 설정한 것을 적어주면 그 곳으로 가게되면서 거기에 있는 코드가 작동되는 원리다.
이때 @RequsetMapping 어노테이션을 별다른 설정 없이 선언하면 HTTP의 모든 여청을 받는데 스프링 4.3버전 이후로는 새로 나온 어노테이션인 @Getmapping, @PostMapping, @PutMapping, @DeletMapping 등으로 사용하게 된다.
@GetMapping(vlaue="/name")
public String getName() {
return "Flature";
이런식으로 코드 구현을 하게 된다면 Get일 때 name url까지 주소를 쳐서 반환하면 Flature 이걸 반환하게 된다.
실무 환경에서는 메개변수를 박지 않는 메서드가 거의 쓰이지 않는다. 웹 통신의 기본 목적은 주고받는 것이기 때문에 대부분 매개변수를 받는 메서드를 작성하게 된다.
이는 URL 자체에 그대로 값을 담아서 요청하는 것을 말한다.
실제 사용시-> http://localhost:8080/variable1/{String 값})
@GetMapping(value=/variable1/{variable}")
public String getVariable1(@PathVariable String variable) {
return variable;
{}안에 위치의 값을 받아 요청하고 실제 요청시에는 중괄호는 들어가지 않으며 값만 존재한다.
이때 중요하게 지켜야 하는 것이 있는데 어노테이션의 값으로 url을 입력할 . 때중괄호를 사용해 어느 위치에서 값을 받을지 지정해야 하며, 매개변수와 값을 연결하기 위해 @PathVariable을 명시해야 한다. => @GetMapping 어노테이션과 @PathVariable에 지정된 변수의 이름을 동일하게 맞춰줘야 한다.
이 방법은 url 경로에 값을 담아 요청보내는 방법 말고도 쿼리 형식으로 값을 전달할 수 있다. ?를 기준으로 {키}={값} 형태로 구성된 요청을 전송하는 방법이다.
@GetMapping(value="/request1")
public String getRequestParm1(
@RequestParam String name,
@RequestParam String email,
@RequestParam String organization) {
return name + " " + email + " " + organization;
}
@RequestParm String name,
@RequestParm String email,
@RequestParm String organization
이런식으로 쿼리스트링으로 명시되어서 키(변수의 이름)이 모두 적혀있어서 이를 통해 매핑하면 된다. 만약 어떤 값이 들어올지 모른다면 Map 객체를 활용할 수도 있다.
@GetMapping(value="/request2")
public String getRequestParm2(@RequestParam Map<String, String> parm) {
StringBuilder sb = new StringBuilder();
parm.entrySet().forEach(map -> {
sb.append(map.getKey() + ":" + map.getValue() + "\n");
});
return sb.toString();
}
Map<String, String> parm은 모든 쿼리 파라미터를 키-값 쌍으로 받는다.
parm.entrySet()은 쿼리 파라미터의 엔트리 세트를 반환한다.forEach는 각 엔트리(키-값 쌍)를 순회한다. 이런 식으로 각 알아서 키 값: 벨류 값 이런식으로 분류를 한다.
dto는 다른 레이어 간의 데이터 교환에 활용된다. 간략하게 각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터 객체이다. 이는 데이터를 교환하는 용도로만 사용하는 객체이기 때문에 별도의 로직이 포함되지 않는다.
아까 만든 name,email,organization을 만들고 getter and setter 매서드를 통하여 구현이 가능하다.
출처: 스프링부트 핵심 가이드(장정우),인프런:스프링 입문(김영한)