[백엔드] 스프링 부트와 JPA 활용 (2편) - API 개발 기본

유승선 ·2022년 9월 19일
0

API 에 대한 공부를 처음 해봤다. 웹개발에 관한 공부와 기본적인 구현에 대한 이해를 JPA 강의와 함께 배웠지만 API 사용에 대한 공부는 많이 못했기에 기본적인 API 가 무엇인지, REST API 가 어떤 뜻인지에 대한 것부터 차근차근 배웠다. 이 강의는 API 성능 최적화에 관한 난이도 있는 강의지만 기본적인게 우선이라고 생각해서 당장 강의를 전부 끝내지는 않고 나눠서 볼려고 목표하는 중이다.

회원 등록 API

회원 등록 API

스프링을 사용할때 view템플릿이랑 관련된것이나 핵심 로직을 구현 할때 @Controller 을 많이 사용했다. 그런데 API 개발의 경우 view 템플릿을 이용한 HTML 기반의 화면이 아니고 리엑트 같은 프론트엔드 엔지니어링 기반의 프로그램을 쓸것이다.

API 기반의 서버와 프로그램을 만들때는 서버와 통신 할 수 있는 JSON 기반의 데이터를 주고 받아야하는데 @ResponseBody 어노테이션을 사용하면 자바 객채를 JSON 형태로 반환 하는게 가능하다. 객채를 return 하고 @ResponseBody 가 있다면은 JSON 으로 반환한다는 뜻이다.

@Controller 와 @ResponseBody 를 합친게 바로 @RestController 이고 API 개발 할때는 필수로 붙혀야 하는 어노테이션이다.

첫번째 버전의 회원 등록 API 이다. 되게 궁금했고 좀 깊게 따로 검색을 하면서 찾았던건 @RequestBody 와 @Valid 였다.

추가적으로 더 설명 할 부분이 많지만 @RequestBody 같은 경우는 HTTP 요청 본문에 담긴 값들을 자바 객체로 변환하고 객체에 저장하는 역활을 담당 하고 있다. 그렇기 때문에 @RequestBody 를 하면은 뒤에 있는 Member member 객체에 변환되서 저장 된다는 뜻이다.

실제로 POSTMAN 에서 JSON 형태의 POST 형식으로 해당 URL 로 요청을 보내니깐 Member 값으로 저장이 되었다.

return 문에 객체를 반환한 것을 볼 수 있는데 성공적으로 API 가 통신 될 경우에 화면에 CreateMemberResponse 객채를 JSON 형태로 변환된 모습으로 볼 수 있었다.

@Data 어노테이션 같은 경우 특별한건 아니고 롬북 어노테이션인데 여러가지가 한번에 들어가 있다.

@Data 자료

그러나 첫번째 버전 같은 경우 문제점이 많은데, 아래와 같다.

문제점을 해결하기 위해서는 API 스펙이 바뀌지 않고 언제든 원하는 데이터만 가지고 올 수 있게 커스텀 하는게 중요하다 했다. 그렇기 때문에 DTO 를 따로 맞추어서 만든다고 한다.

새로운 버전이고 아래와 같이 원하는 데이터만 얻고 그것을 직접 멤버 객채에 옮겨주는게 올바른 API 활용법이라고 설명 해 주었다.

실무에서는 엔티티를 API 스펙에 노출시키면 안된다!


회원 수정 API

회원 수정 API

회원 수정 같은 경우 회원 등록 API 와 굉장히 유사했다. 수정이기 때문에 특정 ID 를 찾기 위한 @PathVariable 어노테이션을 사용해 주었고, 엔티티를 노출 시키지 않기 위해서 UpdateMemberRequest 로 이름 정보만 가지고 오는 스펙으로 맞췄다. 후에는 memberService 에 update() 함 수를 불러서 요청에 맞게 수정했다.

@AllArgsConstructor 같은 경우는 모든 필드가 생성자로 만들어진다고 생각하면 된다.

생성자 주입 설명


회원 조회 API

회원 조회 API

가장 간단한 조회 API 를 만들어 봤다. 사실 이 API 는 간단한 만큼 문제점도 굉장히 많다. 회원을 조회하지만 자세히 보면은 아무런 제약 없이 정말 모든 회원을 조회에서 JSON 형태로 화면에 보여준다. 아무런 필터 없이 이렇게 엔티티를 놓출 시키는것은 보안상에도 큰 문제이기 때문에 API 스펙을 맞춰주며 별도의 DTO 를 만들어야 한다.

자세한 설명은 위와 같다.

두번째 버전의 회원조회 API 이다. 첫번째 버전 처럼 바로 List 를 화면에 띄우는게 아닌 MemberDTO 를 따로 만들어서 회원이 이름만 모은 List 를 조회하는 API 를 만들었다. streams() 같은 자바 문법은 솔직히 아직 익숙하지가 않아서 나도 좀 헷갈리는거 같은데 조만간 자바 문법 정리 포스트도 해야겠다. 할게 정말 많다...


마치며

API 관련 강의는 조금 추후에 다시 와서 배울 생각이다. 당장은 포트폴리오도 그렇고 조금 더 웹기반의 개발을 배우고 싶다. 그래도 API 로 개발해보는 환경은 정말 재밌을거 같고 내가 웹 개발에 익숙해지고 자바 공부에 더 익숙해지면 돌아와서 다시 듣고 싶다.

향후 계획으로는

  1. 타임리프 강의 듣기 (MVC part2)
  2. JPA 강의 리뷰
  3. 개인 프로젝트 연습
  4. CS 지식 공부 (네트워크, OS)
  5. 자바 문법 공부
profile
성장하는 사람

0개의 댓글