2. 간단한 API 서버 만들어보기, 앞으로 커리큘럼 소개
" 스프링부트 백엔드 프로그래밍"이라는 주제로 약 8주간 글을 작성할 예정입니다. 제가 잘못된 길로 가지 않도록, 댓글로 의견 및 조언 부탁드립니다. 또한 2시간만에 빠르게 휘갈겨 쓴 글이라서 오타나 이상한 문구가 있을 수 있습니다. 양해 부탁드립니다..
"지난 글에서는 스프링부트란 무엇인가? 라는 주제로 글을 작성하였습니다. 이번 글에서는, 네이버 오픈 API 를 사용해서 간단한 API 서버를 만들어 보겠습니다. 또한, 앞으로 스터디에서 배우게 될 커리큘럼에 대해서 간략하게 소개합니다.
1주차 - 스프링부트란 무엇인가?, 간단한 API 서버 만들어보기
2. [이번글]간단한 API 서버 만들어보기 (커리큘럼 소개)
[미정]2주차 - 스프링 프레임워크 기본 개념, Rest API
3. [다음글]스프링 프레임워크 DI(의존성주입), Bean, ComponentScan
4. HTTP 기본 개념, Rest API
[미정]3주차 - 스프링부트 테스트 코드 작성하기, 예외 처리하기
5. 테스트 코드 작성하기
6. 예외 처리하기
[미정] 4주차 - 캐싱
[미정] 5주차 - MQ, Pub/Sub
[미정] 6주차 - 보안(인증)
[미정] 7주차 - 병렬, 비동기 프로그래밍
[미정] 8주차 - Spring Cloud
[미정] JPA, Spring Data, Spring Session 등
스터디 내용이 너무 어렵다고 생각되시면, 추천 도서를 같이 보시면서 공부해주시면 됩니다.
http://www.yes24.com/Product/Goods/83849117
스터디는, 해당 책의 내용으로 진행하지는 않습니다. 단, 스프링부트 를 처음 접하는 분들께는 매우 적합한 도서라서 추천해드립니다. 필독서입니다.
심플한 백엔드 API 서버를 만들어보겠습니다.
우리가 만드는 서버의 시스템 구성도입니다. 매우 간단합니다.
우리는, Rest API 기반의 JSON 데이터를 응답해주는 서버를 개발합니다. JSP, 프리마커, 타임리프 등의 서버 템플릿팅 기능을 사용하지 않습니다. 메타 데이터 조회를 위해서 네이버 오픈 API 를 사용할 예정입니다. 참고로, 카카오 오픈 API 를 사용해도 상관없습니다. 이 글의 소스 코드를 그대로 복사하실 필요가 없습니다.
네이버 오픈 API 는 아래 링크에서 가입할 수 있습니다.
https://developers.naver.com/docs/common/openapiguide/
애플리케이션을 등록합니다. 무료 계정은 호출 건수에 제한이 있습니다. 어차피 공부를 위한 등록이라서 크게 상관 없습니다. 작성 폼에 서비스 환경은 http://localhost 를 입력해주면 됩니다.
애플리케이션 등록이 성공하면, Clent ID 와 Cllient Secret 를 발급받습니다. 해당 인증 데이터는 오픈 API 를 호출할 때 반드시 필요합니다.
인증 정보 없이 API 를 호출하면 어떻게 될까요? 영화 검색 오픈 API 주소는 아래와 같습니다.
http://openapi.naver.com/v1/search/movie?query=검색쿼리
인증 실패로 인해서, 데이터를 조회할 수 없습니다.
이번에는, 포스트맨에서 Heasdrs 에 인증 키를 입력한 후 호출해봅니다.
정상적으로 데이터를 조회하는 것을 확인할 수 있습니다. 참고로, HTTP 통신 시 메시지에는 아래와 같은 항목이 포함됩니다.
- 시작 줄(스타트라인, 리퀘스트 라인, 상태라인 등 번역서마다 다름)
- 헤더
- 본문
자세한 내용은 스터디 2주차, 4장에서 HTTP 기본 개념에 대해서 공부합니다... 아니다. 알아서 먼저 공부하시면 됩니다.
우리가 만드는 API 서버는 네이버 오픈 API 를 사용해야 합니다. 이 글에서는, RestTemplate 를 사용합니다.
외부 API 를 호출하는 방법은 다양합니다. 스터디 초반에는 RestTemplate 를 사용할 예정입니다. 사실, 실무에서는 Feign Client 또는 WebClient 를 많이 사용합니다. 실무에서 RestTemplate 를 사용한지 2년이 넘었네요. 암튼, RestTemplate의 세부적인 설정을 하기 위해서 아래와 같이 의존성을 추가합니다.
프로젝트에 의존성을 추가해주면, Gradle 를 새로고침 해주세요.
의존성이 추가된 것을 확인할 수 있습니다.
RestTemplate 를 사용하기 위해서 Bean 을 정의합니다.
이번 스터디는 스프링부트가 처음이지만, 개발 경험이 있는 분에 한해서 진행하는 스터디입니다. 그래서 Bean, DI 등 기본 개념에 대해서 모든 내용을 상세하게 설명하는 것은 시간 관계상 무리가 있습니다. 그래도, 중요한 내용이니 간략하게라도 설명을 하는게 좋을 것 같네요. 스터디 2주차, 3장에서는 스프링의 기본 개념이 되는 DI, Bean 등 에 대해서 설명합니다. Bean 객체로 정의한 RestTempalte Bean은 의존성 주입을 해서 사용할 수 있습니다.
application.properties 파일에 네이버 영화 검색 오픈API 주소를 정의합니다.
https://openapi.naver.com/v1/search/movie.json
resouces 디렉토리에 application-secret.properties 파일을 추가로 생성합니다. 그리고, 네이버 오픈 API 를 호출하기 위해 필요한 인증 정보를 작성합니다.
해당 파일은 git에 등록하지 않습니다. 반드시 git ignore 처리를 해줍니다. 저의 소스트리에서는 아래와 같이 체크하면 되었는데요.. 다른 방법은 저도 까먹어서 모르겠습니다.
어쩃든, secret 파일은 절대로 github 에 업로드 되지 않도록 주의해주세요!! 절대로!!
인텔리 J 에서 Edit Configurations 를 클릭합니다.
Active profiles 항목에 secret 를 작성합니다.
해당 설정 후 애플리케이션을 실행하면, application-secret.properties 파일에 정의한 값을 애플리케이션에서 불러올 수 있습니다. 물론, application.properites 의 설정도 같이 사용합니다. 만약, 똑같은 변수를 작성하였다면, application-secret.properties 를 최종 값으로 사용합니다.
실무에서는 서비스 배포 시 주로 사용합니다. 예를 들어서 application-local, application-dev, , application-beta 와 같이 로컬, 개발, 베타, 상용 등 배포 환경에 맞게 구성을 해줍니다.
2.3.2 에서는 application.properties, application-secret.properties 파일에 오픈 API 의 기본 정보를 정의하였습니다. 해당 값을 애플리케이션에서 사용하기 위해서, 컨피그 클래스를 아래와 같이 정의합니다. prefix 에 반드시 "naver.openapi" 를 작성해야만 정상적으로 불러올 수 있습니다.
지금..정확히 기억이 나지 않습니다. 스프링부트 2.2 인가 2.3 인가부터.. @ConfigurationProperties 말고 다른 좋은 기능이 추가된 걸로 기억하는데요... 일단... 갑니다.
이제, 드디어 영화 검색 서비스 기능을 구현해봅시다. 샘플코드입니다.
https://github.com/sieunkr/spring-study-group/tree/master/1-3
네이버 오픈 API 의 결과를 응답받을 수 있는 객체를 정의합니다.
간단한 인터페이스를 정의합니다.
인터페이스의 구현체를 작성합니다. 이때, RestTemplate, NaverProperties 를 의존성 주입해줍니다.
생성자 주입을 사용해봤습니다. @Autowired 를 사용해도 됩니다. 관련 내용은 2주차-3장에서 DI 에 대해서 좀 더 자세하게 설명합니다.
RestTemplate 를 사용해서 네이버 오픈 API 를 호출하는 구문을 작성해봅시다. restTemplate.exchange 메서드 사용시에 ResponseMovie.clss 를 정의해야 합니다.
위 코드는 방어로직이 전혀 되어 있지 않습니다. 네이버 오픈 API 를 호출하는 순간에, 네트워크 장애가 발생하거나, 인증 실패가 발생한 경우는 어떻게 될까요? 예를 들어서 네이버인증키가 실패하면 아래와 같이 에러가 발생할 것입니다.
우리는 이런 예외 처리를 별도로 해야합니다. 예외 처리에 대해서는 3주차-6장에서 설명하빈다.
위에서 정의한 MovieRepository 는 데이터를 조회하는 로직입니다. 조회해서 가져온 데이터를 가공하고, 응용하는 영역은 서비스 레이어에 구현합니다. MovieService 라는 클래스를 작성합니다.
MovieService 에서는 MovieReposiory 를 주입해줍니다. MovieRespositoryImpl 를 주입하는 것이 아닙니다. 눈으로 보기에는 MovieRepository 인터페이스를 주입하는 것처럼 보이지만, 실제로는 MovieRepository 의 구현체인 MovieRepositoryImpl 를 주입해줄 것입니다. 물론, MovieRepository 의 구현체가 2개 이상이라면 별도의 작업이 필요합니다.
자세한 내용은 2주차-3장 에서 얘기하겠습니다.
movieService 서비스 레이어에서 search 메서드를 실행하면, 실제 데이터를 조회하는 movieRepository 의 findByQuery 메서드를 호출합니다. 애플리케이션을 실행하면. 아래와 같이 호출이 된다.
단, 평점이 높은순으로 정렬이 되진 않았습니다. 평점이 5.83 인 반지의 제왕이 검색이 되었습니다. 말도 안됩니다. 최고의 영화인 반지의 제왕이 5.83 이라니...
네이버 오픈 API 에서 평점순으로 정렬이 제공되는지 스펙을 확인해봅시다.
https://developers.naver.com/docs/search/movie/
아래는 네이버 영화 검색 API 의 요청 변수입니다.
평점 순 정렬 기능은 없네요... 좀 귀찮지만, 따로 기능을 추가해야할 것 같습니다.
샘플 코드
https://github.com/sieunkr/spring-study-group/tree/master/1-4
Movie 객체의 리스트를 갖는 MovieGroup 라는 클래스를 정의해봅니다.
해당 클래스는, 생성자에서 반드시 Movie 리스트를 전달받아야 합니다. 그리고, getListOrderRating 라는 메서드에서 평점이 높은 순으로 정렬해주는 기능을 제공합니다. MovieService 클래스의 search 메서드를 아래와 같이 수정해봅니다.
애플리케이션을 실행하면, 순서대로 정렬이 될 것입니다.
그런데, 이런 기능이 추가될 때마다 애플리케이션을 실행한 후 브라우저에서 테스트를 해야할까요?
MovieService 클래스에서 테스트 클래스를 바로 생성할 수 있습니다.
Create New Test... 를 클릭합니ㅏㄷ.
JUnit5 가 자동으로 선택이 되어있습니다.
생성된 테스트 파일은 test/ 하위에 생성됩니다.
아래 코드처럼 테스트 코드를 작성하시면 됩니다.
테스트 코드에 대해서는 3주차-5장 에서 자세하게 설명합니다.
간단하게 API 를 만들어봤습니다. 앞으로 API 를 계속 개선하면서 우리가 같이 공부해야할 내용은 아래와 같습니다.
위 내용은 필수로 해야하는 내용이라서, 스터디 목차에서 확정입니다. 이후에는 캐싱, MQ, 보안 등에 대해서 공부합니다. 목차에서 확정은 아닙니다만, 백엔드 프로그래밍에서 반드시 필요한 내용들입니다. 그래서 진행할 수 있도록 검토 중입니다만, 아래 내용은 변경될 가능성이 있습니다.
스프링부트의 AutoConfiguration 은 가장 중요합니다. 앞으로 진행하는 캐싱, MQ 등 거의 모든 내용에서 AutoConfiguration 개념이 포함되어있습니다. 사실, 스프링부트가 정말 쉽다는 이유가 바로 AutoConfiguration 때문입니다만, 한편으로는 AutoConfiguration 때문에 어렵다고 생각입니다. 배우면 배울소록 어려운 이 개념은 스터디가 끝날때까지 계속 다룰 예정입니다.
네이버 오픈 API 를 무료로 사용하게 되면, 요청 콜 수 제한이 있습니다. 무제한 호출할 수 없기 때문에 오픈 API 의 데이터를 우리가 구축한 서버에 임시로 저장해야 합니다. 백엔드 프로그래밍의 꽃이라고 할 수 있는 캐싱에 대해서 4주차 에서 다룹니다.
마이크로서비스 아키텍처에서 반드시 알아야하는 기술입니다. 5주차에서 다룹니다.
Rest API 의 보안 처리에 대해서 얘기합니다. 6주차에서 다룹니다.
스프링에서 제공하는 @Async 어노테이션, 자바의 CompletableFuture 에 대해서 설명합니다. 7주차입니다.
스프링 클라우드는 저에게 너무 익숙한 기술이지만, 취준생에게 당장 필요한 기술은 아니라고 생각이 됩니다. 시간 여유가 되면, 간략하게 설명하는 수준으로 마무리할 예정입니다.
시간 여유가 된다면 진행할 예정입니다. JPA 는 저에게 익숙하지 않고, 정말 어려운 기술입니다. 1,2 주에 설명할 수 있는 개념이 아니라고 생각합니다. 그래도, JPA 는 너무 중요하기 때문에 꼭 진행을 해보도록 검토 중입니다.
시간 여유가 된다면 진행할 예정입니다. 저에게 익숙하지 않고 어려운 기술입니다. 그래서, 미정입니다.
필수과제
1. 어노테이션이 어떤 기능을 하는지 정리 (구글링을 하시면 나옵니다.)
스프링 : @RestController, @RequestMapping, @GetMapping, @Service, @Compoment, @Configuration, @SpringBootApplication
Lombok : @Getter, @Setter, @Data, @Builder
2. 스프링 프레임워크의 DI 에 대해서, 면접 때 설명할 수 있는 수준으로 정리
정리 된 문서는, github or 개인 블로그에 정리해서 제출해주세요.
3. 네이버 오픈 API 에 애플리케이션을 등록해주세요.
4. 샘플 소스를 개발툴 IntelliJ 에서 실행해보고 잘 되는지 확인해주세요.
선택과제(가능하면 해보기.. 너무 어려우시면 다음 주차에 하는걸로...)
1. 샘플 소스에서는 영화 검색 API 를 사용했는데요. 응답 데이터 필드가 누락되어있습니다. 데이터를 전부 가져올 수 있도록 필드를 추가해주세요.
2. 테스트 코드를 작성해보세요.
3. 영화 외 다른 검색 서비스를 하나만 추가로 연동해보세요. 아래 중 아무거나 하나만.. 자유롭게!!
(지금 저와 함께 스터디 참여 중이신 인원은 github 에 PR 을 보내주세요. PR 방법은 따로 설명 예정)
1주 차의 두 번째 글을 마무리합니다. 글을 너무 빠르게 작성한것 같네요... 암튼, 간단한 API 서버를 만들어봤고, 앞으로의 커리큘럼에 대해서도 소개하였습니다. 스터디가 잘 유지될지 의문? 걱정이지만.. 이만 마치겠습니다.
다음 글 - 미정..