Spring MVC 구조에서 REST 를 지원하기 위해서 기존 @Controller 어노테이션에 @RestController 이라는 어노테이션이 추가되었다. @Controller 어노테이션은 View를 리턴해야 했어나, @RestController 는 Jackson Mapper의 도움으로 JSON을 리턴할 수 있게 되었다. 그 외에 REST를 지원하기 위한 다양한 어노테이션이 많이 추가되었다.

Spring 에서는 JPA ORM을 사용할 수도 있고 MyBatis라는 ORM을 사용할 수도 있다. 공공기관, 대기업같은 환경은 아직도 대부분 Mybatis ORM을 사용하고 있으나 점점 JPA 쪽으로 옮겨 가고 있는 추세이다. DB를 Oracle 이나 Mysql과 같이 하나만 쓴다면 MyBatis ORM이 좋은 선택일 수 있다. 그러나 다양한 DB 에서 사용할려면 DB마다 다 다른 Dialect를 반영해서 MyBatis 구문을 작성하기에는 개발 비용이 만만하지 않으므로 JPA가 좋은 선택이다. 여기서는 Mybatis ORM을 적용해보겠다.

로컬 DB 환경을구축하지 않았다면, 여기를 참고해서 로컬 DB 환경을 구축한다.

+ 사용된 기술

Spring Boot + Gradle + MyBatis + Swagger

소스는 아래에서 찾을수 있다.
+ https://github.com/eastflag/spring-rest-tutorial

앞에서 DB를 구축하였다면 board 테이블이 생성되었을 것이고, board 테이블에 대해서 REST api를 만들어본다. 만들려는 REST api는 다음과 같다.

1. 프로젝트 생성 및 실행

먼저 java 1.8 이상과 intelliJ IDEA 툴먼저 java 1.8 이상과 intelliJ IDEA 툴은 설치되어있어야 한다. IDEA New->Project 에서 Spring Initializer를 선택하고 Next Group은 패키지명, Artifact는 프로젝트 명이라고 생각하고 적당히 수정한다. Type은 Maven보다 Gradle을 선택한다. java version은 8로 선택한다. 그 다음 화면에서는 Lombok 하나만 선택한다.Web, JDBC, MySQL, 등의 기능은 gradle 에 의존성을 하나씩 추가하면서 어떻게 변화되는지

Read more ...

2 GET 과 POST의 이해

Control 레이어 - 입력과 출력 담당 클라이언트가 http를 요청시 요청을 처리하고 응답을 해주는 레이어이다. 로직이 복잡해지면 비즈니스 레이어를 추가할 수 도있고, DB 를 처리한다면 persistence 레이어가 더 추가될 수 있다. 디자인 패턴이란게 정답이 있는게 아니므로, 무조건 컨트롤 레이어, 비즈니스 레이어, persistence 레이어가 있어야 한다고 생각하지말고 어떻게 하는게 좀 더 확장성 있고 유지보수성이 있는지 생각해보고 받아들이자.

Read more ...

3. json 보내고 받기

VO 객체 만들기 Json은 JavaScript Object Notation이다. 스트링타입이 아니라 { “code”: 0, “message”: “name” } 라는 json 형태로 리턴하기 위해서 com.eastflag.fullstack 폴더에 domain 패키지를 추가하고 ResultVO 클래스를 추가한다. [crayon-60761542b4b14907694107/] 여기서 어노테이션은 lombok에서 설정한 라이브러리이다. gradle.build에 Lombok 라이브러리가 추가되었기 때무에 compile 에러는 나지 않지만 실제로 동작하기 위해서는 컴파일시에 Lombok 라이브러리가 idea 개발툴이 빌드할 때 관련 작업을 해줘야 한다.

Read more ...

4. Mybatis ORM 연동

앞에서 로컬환경에서 Docker를 띄우고 MariaDB를 이미 구동하였다. 만일 아직 DB를 구축하지 않았다면 여기를 참고하자. JPA ORM과 Mybatis ORM 중에서 여기서는 Mybatis 로 연동하겠다. 스프링과 DB 연동 이제 스프링 boot에서 데이터베이스로 연동한다.  스프링에서 사용하는 ORM 솔루션은 JPA와 MyBatis 두가지가 가장 많이 사용되는데, 둘 다 장단점이 있다. 간단한 CRUD를 한다면 JPA로 하는게 편하고 복잡한 join문으로 쿼리가 복잡해지면

Read more ...

4.1 board 생성 api

domain 패키지 생성 request 와 response 시 json 으로 데이터를 주고 받게 되는데 java에는 json 이라는 데이터 타입이 없다. 그래서 json과 매핑할 수 있는 객체를 생성하는데 그것을 VO 혹은 DTO 라고 한다. VO는 Virtual Object 그리고, DTO는 Data Transfer Object라고 모두 데이터를 담기 위한 객체이다. json과 java 객체 간의 매핑은 jackson 매퍼라는 3rd party 라이브러리가

Read more ...

4.2 board 목록보기, 상세보기 api

board 라는 게시판 데이터가 쌓이게 되면 두가지의 api가 필요하게 된다. 첫번재는 게시판 목록을 보는 API와 두번째는 하나의 board를 상세하게 보는 API이다. 그래서 여기서는 두 개의 API를 구현한다. 목록보기: /api/boards상세보기: /api/board/{id} persistence 구현 id를 입력으로 해서 하나의 board를 가져오는 api와 모든 board를 가져오는 두개의 select 쿼리문을 Mybatis 쿼리 구문으로 작성한다. [crayon-60761542b6008948847022/] Controller 구현 목록보기, 상세보기에 해당하는

Read more ...

4.3 board 수정 api

board 를 수정하는 api를 만든다. 관례적으로 수정하는 http 메서드는 put 메서드를 사용한다. 무조건 put 메서드를 사용해야 하는것은 아니다. post 메서드를 사용한다고 해서 잘못된건 아니다. 왜냐하면 REST는 표준이 아니기 때문에. 그래서 수정할 때는 put을 사용하고 생성할 때는 post를 관례적으로 사용한다. persistence 구현 [crayon-60761542b6664886566266/] update 되는 property가 있을수도 있고 없을수도 있기 때문에 if 구문으로 null여부를 체크한다. 그리고,

Read more ...

4.4 board 삭제 api

삭제하는 http 메서드는 delete 를 사용한다. 그런데, delete도 get과 마찬가지로 request 시에 body가 없다. 그래서 query parameter로 데이터를 전달하거나 uri parameter 방식으로 데이터를 전달해야 한다. 앞에서 board 상세보기시 uri parameter를 사용했으므로 여기서는 query parameter를 한번 사용하겠다. persistence 구현 [crayon-60761542b6d2b609611115/] controller 구현 호출 유알엘은 /api/board 이고 메서드는 delete, 입력파라메터는 Query Parameter로 받는다. delete메서드는 Get 메서드와 동일하게

Read more ...

4.5 이미지 upload – DB 저장

이미지 업로드 프로토콜 이미지를 업로드하는 방법은 두가지이다. 첫번째는 file upload 버튼을 사용해서 올리게 되는 multi-part 프로토콜 방식이다. 이 때는 브라우저가 해당 프로토콜에 맞게 올려주게 된다. 파일을 업로드하는 메서드는 Post 이다. 그런데  Content-Type이 좀 독특하다. Request할때 헤더를 fiddler를 사용해서 살펴보면, 아래와 같다. Content-Type: multipart/form-data; boundary=xxxxxxxxxxxxxxxxxxx body에 보내는 데이터의 content type이 form-data이긴 한데 여러부분으로 나누어 보낸다는 multipart

Read more ...

5. spring에 swagger 적용하기

swagger란 swagger는 REST api 문서를 자동으로 생성해주는 라이브러리이다. 예를들어서 앞에서 만든 게시판 생성 API를 만들었으면 프런트엔드 개발자가 사용할 수 있도록 문서를 다음과 같이 만들어 줘야 한다. url: /api/boardmethod: POSTrequest: json예: { "title": "제목", "content": "내용"}response: json예: { "code": 0, "message": "success"} 이와 같으 API 문서를 작성해야 프런트엔드 개발자가 개발할 수있다. swagger는 이와 같은 API 문서를

Read more ...