{"componentChunkName":"component---src-templates-blog-post-js","path":"/springboot/스프링-부트-API-인터페이스-및-결과-데이터-구조-설계/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"1d265aed-cb89-52b1-bde2-48c14a1107ce","excerpt":"스프링 부트 API 인터페이스 및 결과 데이터 구조 설계 API 서버 개발 진행을 위해 api 인터페이스 및 결과 데이터의 구조를 살펴보고 확장 가능한 형태로 설계해 보자. api는 제공 대상이 클라이언트 App 또는 Web 개발자이다. 한번 배포되고 공유한 API…","html":"<p><img src=\"/assets/springboot.png\" alt=\"스프링 부트 API 인터페이스 및 결과 데이터 구조 설계\" title=\"스프링 부트 API 인터페이스 및 결과 데이터 구조 설계\"></p>\n<p>API 서버 개발 진행을 위해 api 인터페이스 및 결과 데이터의 구조를 살펴보고 확장 가능한 형태로 설계해 보자. api는 제공 대상이 클라이언트 App 또는 Web 개발자이다. 한번 배포되고 공유한 API는 구조를 쉽게 바꿀 수 없기 때문에, 처음부터 효율적이고 확장 가능한 형태로 모델을 설계하고 시작하는 것이 좋다. 그래서 아래와 같이 HttpMethod를 사용하고 Restful 한 API를 만들기 위해 몇 가지 규칙을 적용하도록 하겠다.</p>\n<h2 id=\"api-인터페이스\" style=\"position:relative;\"><a href=\"#api-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4\" aria-label=\"api 인터페이스 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>API 인터페이스</h2>\n<h3 id=\"리소스의-사용목적에-따라-http-method-구분\" style=\"position:relative;\"><a href=\"#%EB%A6%AC%EC%86%8C%EC%8A%A4%EC%9D%98-%EC%82%AC%EC%9A%A9%EB%AA%A9%EC%A0%81%EC%97%90-%EB%94%B0%EB%9D%BC-http-method-%EA%B5%AC%EB%B6%84\" aria-label=\"리소스의 사용목적에 따라 http method 구분 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>리소스의 사용목적에 따라 Http method 구분</h3>\n<p>Http 프로토콜은 여러 가지 사용목적에 따라 HttpMethod를 제공하고 있다. 여기서는 그중 아래의 5가지 HttpMethod를 상황에 맞게 api 구현에 사용하도록 하겠다.</p>\n<ul>\n<li>GET : 서버에 주어진 리소스의 정보를 요청.(읽기)</li>\n<li>POST : 서버에 리소스를 제출. (쓰기)</li>\n<li>PUT : 서버에 리소스를 제출, POST와 달리 리소스 갱신 시 사용한다.(수정)</li>\n<li>DELETE : 서버에 주어진 리소스를 삭제 요청한다.(삭제 시)</li>\n<li>FETCH : 서버에 리소스를 제출, PUT와 달리 특정 리소스 갱신 시 사용한다.(일부 수정)</li>\n</ul>\n<h3 id=\"리소스에-mapping된-주소-체계-정형화\" style=\"position:relative;\"><a href=\"#%EB%A6%AC%EC%86%8C%EC%8A%A4%EC%97%90-mapping%EB%90%9C-%EC%A3%BC%EC%86%8C-%EC%B2%B4%EA%B3%84-%EC%A0%95%ED%98%95%ED%99%94\" aria-label=\"리소스에 mapping된 주소 체계 정형화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>리소스에 Mapping된 주소 체계 정형화</h3>\n<p>주소 체계는 아래처럼 정형화된 구조로 구성하고 HttpMethod를 통해 리소스의 사용목적을 판단되도록 한다.</p>\n<ul>\n<li>GET /api/v1/api/user/{userId} – 회원 userId에 해당하는 정보를 조회한다.</li>\n<li>GET /api/v1/users – 회원 리스트를 조회한다.</li>\n<li>POST /api/v1/user – 신규 회원정보를 입력한다.</li>\n<li>PUT /api/v1/user/{userId} – 기존 회원의 정보를 수정한다.</li>\n<li>DELETE /api/v1/user/{userId} – userId로 기존 회원의 정보를 삭제한다.</li>\n<li>PUT /api/v1/user/{userId} – 기존 회원의 특정 정보만을 수정한다.</li>\n</ul>\n<h3 id=\"결과-데이터-구조-표준화\" style=\"position:relative;\"><a href=\"#%EA%B2%B0%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0-%ED%91%9C%EC%A4%80%ED%99%94\" aria-label=\"결과 데이터 구조 표준화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>결과 데이터 구조 표준화</h3>\n<p>결과 데이터는 아래의 샘플처럼 결과 데이터 + api요청 결과 데이터로 구성한다.</p>\n<h4 id=\"결과-모델의-정의\" style=\"position:relative;\"><a href=\"#%EA%B2%B0%EA%B3%BC-%EB%AA%A8%EB%8D%B8%EC%9D%98-%EC%A0%95%EC%9D%98\" aria-label=\"결과 모델의 정의 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>결과 모델의 정의</h4>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token comment\">// 기존 USER 정보</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"email\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"id@domain.com\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"user name\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token comment\">// 표준화한 USER 정보</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"data\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"email\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"id@doamin.com\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"user name\"</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"success\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"code\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"message\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"성공하였습니다.\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"구현\" style=\"position:relative;\"><a href=\"#%EA%B5%AC%ED%98%84\" aria-label=\"구현 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>구현</h2>\n<h3 id=\"api의-실행-결과를-담는-공통-모델\" style=\"position:relative;\"><a href=\"#api%EC%9D%98-%EC%8B%A4%ED%96%89-%EA%B2%B0%EA%B3%BC%EB%A5%BC-%EB%8B%B4%EB%8A%94-%EA%B3%B5%ED%86%B5-%EB%AA%A8%EB%8D%B8\" aria-label=\"api의 실행 결과를 담는 공통 모델 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>api의 실행 결과를 담는 공통 모델</h3>\n<p>api의 처리 상태 및 메시지를 내려주는 데이터로 구성된다. success는 api의 성공실패 여부를 나타내고 code, msg는 해당 상황에서의 응답 코드와 응답 메시지를 나타낸다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Getter</span>\n<span class=\"token annotation punctuation\">@MappedSuperclass</span>\n<span class=\"token annotation punctuation\">@EntityListeners</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">AuditingEntityListener</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">BaseEntity</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">Serializable</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">long</span> serialVersionUID <span class=\"token operator\">=</span> <span class=\"token number\">9141498463876264960L</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token annotation punctuation\">@CreationTimestamp</span>\n  <span class=\"token annotation punctuation\">@Temporal</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">TemporalType</span><span class=\"token punctuation\">.</span><span class=\"token constant\">TIMESTAMP</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@JsonFormat</span><span class=\"token punctuation\">(</span>shape <span class=\"token operator\">=</span> <span class=\"token class-name\">JsonFormat<span class=\"token punctuation\">.</span>Shape</span><span class=\"token punctuation\">.</span><span class=\"token constant\">STRING</span><span class=\"token punctuation\">,</span> pattern <span class=\"token operator\">=</span> <span class=\"token string\">\"yyyy-MM-dd HH:mm:ss\"</span><span class=\"token punctuation\">,</span>\n      timezone <span class=\"token operator\">=</span> <span class=\"token string\">\"Asia/Seoul\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@Column</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"reg_dt\"</span><span class=\"token punctuation\">,</span> updatable <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">private</span> <span class=\"token class-name\">Date</span> reg_dt<span class=\"token punctuation\">;</span>\n\n  <span class=\"token annotation punctuation\">@UpdateTimestamp</span>\n  <span class=\"token annotation punctuation\">@Temporal</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">TemporalType</span><span class=\"token punctuation\">.</span><span class=\"token constant\">TIMESTAMP</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@JsonFormat</span><span class=\"token punctuation\">(</span>shape <span class=\"token operator\">=</span> <span class=\"token class-name\">JsonFormat<span class=\"token punctuation\">.</span>Shape</span><span class=\"token punctuation\">.</span><span class=\"token constant\">STRING</span><span class=\"token punctuation\">,</span> pattern <span class=\"token operator\">=</span> <span class=\"token string\">\"yyyy-MM-dd HH:mm:ss\"</span><span class=\"token punctuation\">,</span>\n      timezone <span class=\"token operator\">=</span> <span class=\"token string\">\"Asia/Seoul\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@Column</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"mod_dt\"</span><span class=\"token punctuation\">,</span> updatable <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">private</span> <span class=\"token class-name\">Date</span> mod_dt<span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// 변환 로직을 직접 구현</span>\n\n  <span class=\"token keyword\">public</span> <span class=\"token class-name\">Date</span> <span class=\"token function\">getRegDt</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> reg_dt<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setRegDt</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Date</span> reg_dt<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>reg_dt <span class=\"token operator\">=</span> reg_dt<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">public</span> <span class=\"token class-name\">Date</span> <span class=\"token function\">getModDt</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> mod_dt<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setModDt</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Date</span> mod_dt<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>mod_dt <span class=\"token operator\">=</span> mod_dt<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"결과가-단일건인-api를-담는-모델\" style=\"position:relative;\"><a href=\"#%EA%B2%B0%EA%B3%BC%EA%B0%80-%EB%8B%A8%EC%9D%BC%EA%B1%B4%EC%9D%B8-api%EB%A5%BC-%EB%8B%B4%EB%8A%94-%EB%AA%A8%EB%8D%B8\" aria-label=\"결과가 단일건인 api를 담는 모델 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>결과가 단일건인 api를 담는 모델</h3>\n<p>Generic Interface에 <T>를 지정하여 어떤 형태의 값도 넣을 수 있도록 구현합니다. 또한 CommonResult를 상속받으므로 api요청 결과도 같이 출력되도록 합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@RestController</span>\n<span class=\"token annotation punctuation\">@Api</span><span class=\"token punctuation\">(</span>tags <span class=\"token operator\">=</span> <span class=\"token string\">\"공지사항\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token annotation punctuation\">@RequestMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/api\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">NoticeController</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>code\n  <span class=\"token annotation punctuation\">@ManyToMany</span><span class=\"token punctuation\">(</span>fetch <span class=\"token operator\">=</span> <span class=\"token class-name\">FetchType</span><span class=\"token punctuation\">.</span><span class=\"token constant\">LAZY</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@ApiOperation</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"조회-단건\"</span><span class=\"token punctuation\">,</span> notes <span class=\"token operator\">=</span> <span class=\"token string\">\"단건 조회\"</span><span class=\"token punctuation\">,</span> tags <span class=\"token operator\">=</span> <span class=\"token string\">\"공지사항\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@GetMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/notice/{id}\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@ResponseStatus</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token class-name\">HttpStatus</span><span class=\"token punctuation\">.</span><span class=\"token constant\">OK</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">public</span> <span class=\"token class-name\">Notice</span> <span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@PathVariable</span> <span class=\"token class-name\">Integer</span> id<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> noticeService<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>code\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"결과가-여러건인-api를-담는-모델\" style=\"position:relative;\"><a href=\"#%EA%B2%B0%EA%B3%BC%EA%B0%80-%EC%97%AC%EB%9F%AC%EA%B1%B4%EC%9D%B8-api%EB%A5%BC-%EB%8B%B4%EB%8A%94-%EB%AA%A8%EB%8D%B8\" aria-label=\"결과가 여러건인 api를 담는 모델 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>결과가 여러건인 api를 담는 모델</h3>\n<p>api 결과가 다중 건인 경우에 대한 데이터 모델이다. 결과 필드를 List 형태로 선언하고 Generic Interface에 <T>를 지정하여 어떤 형태의 List값도 넣을 수 있도록 구현합니다. 또한 CommonResult를 상속받으므로 api요청 결과도 같이 출력되도록 합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@RestController</span>\n<span class=\"token annotation punctuation\">@Api</span><span class=\"token punctuation\">(</span>tags <span class=\"token operator\">=</span> <span class=\"token string\">\"공지사항\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token annotation punctuation\">@RequestMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/api\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">NoticeController</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>code\n  <span class=\"token annotation punctuation\">@ManyToMany</span><span class=\"token punctuation\">(</span>fetch <span class=\"token operator\">=</span> <span class=\"token class-name\">FetchType</span><span class=\"token punctuation\">.</span><span class=\"token constant\">LAZY</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@ApiOperation</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"조회\"</span><span class=\"token punctuation\">,</span> notes <span class=\"token operator\">=</span> <span class=\"token string\">\"전체 조회\"</span><span class=\"token punctuation\">,</span> tags <span class=\"token operator\">=</span> <span class=\"token string\">\"공지사항\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@GetMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/notice\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@ResponseStatus</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token class-name\">HttpStatus</span><span class=\"token punctuation\">.</span><span class=\"token constant\">OK</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">public</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Notice</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> noticeService<span class=\"token punctuation\">.</span><span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>code\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"결과-모델을-처리할-service-정의\" style=\"position:relative;\"><a href=\"#%EA%B2%B0%EA%B3%BC-%EB%AA%A8%EB%8D%B8%EC%9D%84-%EC%B2%98%EB%A6%AC%ED%95%A0-service-%EC%A0%95%EC%9D%98\" aria-label=\"결과 모델을 처리할 service 정의 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>결과 모델을 처리할 Service 정의</h3>\n<p>결과 모델에 데이터를 넣어주는 역할을 할 Service를 정의합니다. api.service 하위에 service package를 생성하고 아래의 Service Class를 생성합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">NoticeService</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>code\n  <span class=\"token comment\">// 조회</span>\n  <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Notice</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// 조회-단건</span>\n  <span class=\"token class-name\">Notice</span> <span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Integer</span> id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>code\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Service</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">NoticeServiceImpl</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">NoticeService</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>code\n  <span class=\"token comment\">// 조회</span>\n  <span class=\"token annotation punctuation\">@Override</span>\n  <span class=\"token keyword\">public</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Notice</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> noticeRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// 조회-단건</span>\n  <span class=\"token annotation punctuation\">@Override</span>\n  <span class=\"token keyword\">public</span> <span class=\"token class-name\">Notice</span> <span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Integer</span> id<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> noticeRepository<span class=\"token punctuation\">.</span><span class=\"token function\">getOne</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>code\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"httpmethod와-정형화된-주소체계를-controller에-정의\" style=\"position:relative;\"><a href=\"#httpmethod%EC%99%80-%EC%A0%95%ED%98%95%ED%99%94%EB%90%9C-%EC%A3%BC%EC%86%8C%EC%B2%B4%EA%B3%84%EB%A5%BC-controller%EC%97%90-%EC%A0%95%EC%9D%98\" aria-label=\"httpmethod와 정형화된 주소체계를 controller에 정의 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>HttpMethod와 정형화된 주소체계를 Controller에 정의</h3>\n<p>소스의 사용 목적에 따라 GetMapping, PostMapping, PutMapping, DeleteMapping, FetchMapping 사용</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@RestController</span>\n<span class=\"token annotation punctuation\">@Api</span><span class=\"token punctuation\">(</span>tags <span class=\"token operator\">=</span> <span class=\"token string\">\"공지사항\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token annotation punctuation\">@RequestMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/api\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">NoticeController</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">NoticeService</span> noticeService<span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">public</span> <span class=\"token class-name\">NoticeController</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">NoticeService</span> noticeService<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>noticeService <span class=\"token operator\">=</span> noticeService<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token annotation punctuation\">@ManyToMany</span><span class=\"token punctuation\">(</span>fetch <span class=\"token operator\">=</span> <span class=\"token class-name\">FetchType</span><span class=\"token punctuation\">.</span><span class=\"token constant\">LAZY</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@ApiOperation</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"조회\"</span><span class=\"token punctuation\">,</span> notes <span class=\"token operator\">=</span> <span class=\"token string\">\"전체 조회\"</span><span class=\"token punctuation\">,</span> tags <span class=\"token operator\">=</span> <span class=\"token string\">\"공지사항\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@GetMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/notice\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@ResponseStatus</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token class-name\">HttpStatus</span><span class=\"token punctuation\">.</span><span class=\"token constant\">OK</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">public</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Notice</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> noticeService<span class=\"token punctuation\">.</span><span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token annotation punctuation\">@ManyToMany</span><span class=\"token punctuation\">(</span>fetch <span class=\"token operator\">=</span> <span class=\"token class-name\">FetchType</span><span class=\"token punctuation\">.</span><span class=\"token constant\">LAZY</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@ApiOperation</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"조회-단건\"</span><span class=\"token punctuation\">,</span> notes <span class=\"token operator\">=</span> <span class=\"token string\">\"단건 조회\"</span><span class=\"token punctuation\">,</span> tags <span class=\"token operator\">=</span> <span class=\"token string\">\"공지사항\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@GetMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/notice/{id}\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@ResponseStatus</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token class-name\">HttpStatus</span><span class=\"token punctuation\">.</span><span class=\"token constant\">OK</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">public</span> <span class=\"token class-name\">Notice</span> <span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@PathVariable</span> <span class=\"token class-name\">Integer</span> id<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> noticeService<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token annotation punctuation\">@ApiOperation</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"등록\"</span><span class=\"token punctuation\">,</span> notes <span class=\"token operator\">=</span> <span class=\"token string\">\"등록\"</span><span class=\"token punctuation\">,</span> tags <span class=\"token operator\">=</span> <span class=\"token string\">\"공지사항\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@PostMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/notice\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@ResponseStatus</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token class-name\">HttpStatus</span><span class=\"token punctuation\">.</span><span class=\"token constant\">OK</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">public</span> <span class=\"token class-name\">Notice</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@RequestBody</span> <span class=\"token class-name\">Notice</span> notice<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> noticeService<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>notice<span class=\"token punctuation\">.</span><span class=\"token function\">getTitle</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> notice<span class=\"token punctuation\">.</span><span class=\"token function\">getCont</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> notice<span class=\"token punctuation\">.</span><span class=\"token function\">getTp</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token annotation punctuation\">@ApiOperation</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"삭제\"</span><span class=\"token punctuation\">,</span> notes <span class=\"token operator\">=</span> <span class=\"token string\">\"전체 삭제\"</span><span class=\"token punctuation\">,</span> tags <span class=\"token operator\">=</span> <span class=\"token string\">\"공지사항\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@DeleteMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/notice\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@ResponseStatus</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token class-name\">HttpStatus</span><span class=\"token punctuation\">.</span><span class=\"token constant\">OK</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">removeAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    noticeService<span class=\"token punctuation\">.</span><span class=\"token function\">removeAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token annotation punctuation\">@ApiOperation</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"삭제-단건\"</span><span class=\"token punctuation\">,</span> notes <span class=\"token operator\">=</span> <span class=\"token string\">\"단건 삭제\"</span><span class=\"token punctuation\">,</span> tags <span class=\"token operator\">=</span> <span class=\"token string\">\"공지사항\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@DeleteMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/notice/{id}\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@ResponseStatus</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token class-name\">HttpStatus</span><span class=\"token punctuation\">.</span><span class=\"token constant\">OK</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">remove</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@PathVariable</span> <span class=\"token class-name\">Integer</span> id<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    noticeService<span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token annotation punctuation\">@ApiOperation</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"수정\"</span><span class=\"token punctuation\">,</span> notes <span class=\"token operator\">=</span> <span class=\"token string\">\"단건 수정\"</span><span class=\"token punctuation\">,</span> tags <span class=\"token operator\">=</span> <span class=\"token string\">\"공지사항\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@PutMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/notice/{id}\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token annotation punctuation\">@ResponseStatus</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token class-name\">HttpStatus</span><span class=\"token punctuation\">.</span><span class=\"token constant\">OK</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">public</span> <span class=\"token class-name\">Notice</span> <span class=\"token function\">modify</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@PathVariable</span> <span class=\"token class-name\">Integer</span> id<span class=\"token punctuation\">,</span> <span class=\"token annotation punctuation\">@RequestBody</span> <span class=\"token class-name\">Notice</span> notice<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> noticeService<span class=\"token punctuation\">.</span><span class=\"token function\">modify</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> notice<span class=\"token punctuation\">.</span><span class=\"token function\">getTitle</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> notice<span class=\"token punctuation\">.</span><span class=\"token function\">getCont</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> notice<span class=\"token punctuation\">.</span><span class=\"token function\">getTp</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>api 서비스를 구축하기 위한 인터페이스 및 결과 구조 설계 방법 이다.</p>\n<p>자세한 소스 코드는 ”<a href=\"https://github.com/bottlehs/springboot-vue-starter-kit\">https://github.com/bottlehs/springboot-vue-starter-kit</a>” 참고 하길 바란다.</p>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/springboot/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-API-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B0%8F-%EA%B2%B0%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%84%A4%EA%B3%84/#api-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4\">API 인터페이스</a></p>\n<ul>\n<li><a href=\"/springboot/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-API-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B0%8F-%EA%B2%B0%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%84%A4%EA%B3%84/#%EB%A6%AC%EC%86%8C%EC%8A%A4%EC%9D%98-%EC%82%AC%EC%9A%A9%EB%AA%A9%EC%A0%81%EC%97%90-%EB%94%B0%EB%9D%BC-http-method-%EA%B5%AC%EB%B6%84\">리소스의 사용목적에 따라 Http method 구분</a></li>\n<li><a href=\"/springboot/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-API-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B0%8F-%EA%B2%B0%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%84%A4%EA%B3%84/#%EB%A6%AC%EC%86%8C%EC%8A%A4%EC%97%90-mapping%EB%90%9C-%EC%A3%BC%EC%86%8C-%EC%B2%B4%EA%B3%84-%EC%A0%95%ED%98%95%ED%99%94\">리소스에 Mapping된 주소 체계 정형화</a></li>\n<li>\n<p><a href=\"/springboot/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-API-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B0%8F-%EA%B2%B0%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%84%A4%EA%B3%84/#%EA%B2%B0%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0-%ED%91%9C%EC%A4%80%ED%99%94\">결과 데이터 구조 표준화</a></p>\n<ul>\n<li><a href=\"/springboot/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-API-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B0%8F-%EA%B2%B0%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%84%A4%EA%B3%84/#%EA%B2%B0%EA%B3%BC-%EB%AA%A8%EB%8D%B8%EC%9D%98-%EC%A0%95%EC%9D%98\">결과 모델의 정의</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p><a href=\"/springboot/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-API-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B0%8F-%EA%B2%B0%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%84%A4%EA%B3%84/#%EA%B5%AC%ED%98%84\">구현</a></p>\n<ul>\n<li><a href=\"/springboot/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-API-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B0%8F-%EA%B2%B0%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%84%A4%EA%B3%84/#api%EC%9D%98-%EC%8B%A4%ED%96%89-%EA%B2%B0%EA%B3%BC%EB%A5%BC-%EB%8B%B4%EB%8A%94-%EA%B3%B5%ED%86%B5-%EB%AA%A8%EB%8D%B8\">api의 실행 결과를 담는 공통 모델</a></li>\n<li><a href=\"/springboot/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-API-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B0%8F-%EA%B2%B0%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%84%A4%EA%B3%84/#%EA%B2%B0%EA%B3%BC%EA%B0%80-%EB%8B%A8%EC%9D%BC%EA%B1%B4%EC%9D%B8-api%EB%A5%BC-%EB%8B%B4%EB%8A%94-%EB%AA%A8%EB%8D%B8\">결과가 단일건인 api를 담는 모델</a></li>\n<li><a href=\"/springboot/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-API-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B0%8F-%EA%B2%B0%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%84%A4%EA%B3%84/#%EA%B2%B0%EA%B3%BC%EA%B0%80-%EC%97%AC%EB%9F%AC%EA%B1%B4%EC%9D%B8-api%EB%A5%BC-%EB%8B%B4%EB%8A%94-%EB%AA%A8%EB%8D%B8\">결과가 여러건인 api를 담는 모델</a></li>\n<li><a href=\"/springboot/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-API-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B0%8F-%EA%B2%B0%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%84%A4%EA%B3%84/#%EA%B2%B0%EA%B3%BC-%EB%AA%A8%EB%8D%B8%EC%9D%84-%EC%B2%98%EB%A6%AC%ED%95%A0-service-%EC%A0%95%EC%9D%98\">결과 모델을 처리할 Service 정의</a></li>\n<li><a href=\"/springboot/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-API-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B0%8F-%EA%B2%B0%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%84%A4%EA%B3%84/#httpmethod%EC%99%80-%EC%A0%95%ED%98%95%ED%99%94%EB%90%9C-%EC%A3%BC%EC%86%8C%EC%B2%B4%EA%B3%84%EB%A5%BC-controller%EC%97%90-%EC%A0%95%EC%9D%98\">HttpMethod와 정형화된 주소체계를 Controller에 정의</a></li>\n</ul>\n</li>\n</ul>","wordCount":{"words":377},"fields":{"slug":"/springboot/스프링-부트-API-인터페이스-및-결과-데이터-구조-설계/","image":"/assets/springboot.png","faq":[]},"frontmatter":{"title":"스프링 부트 API 인터페이스 및 결과 데이터 구조 설계","date":"2021년 4월 8일","dateISO":"2021-04-08T20:29:29.537Z","updatedISO":null,"category":"springboot","description":"Http 프로토콜은 여러 가지 사용목적에 따라 GET, POST, PUT, DELETE, FETCH.. 등 HttpMethod를 제공하고 있다. 주소 체계는 정형화된 구조로 구성하고 HttpMethod를 통해 리소스의 사용목적을 판단되도록 해야 한다.","tags":["스프링","스프링부트","Spring","SpringBoot","Java","프레임워크","스프링부트구조","아키텍쳐"]}}},"pageContext":{"slug":"/springboot/스프링-부트-API-인터페이스-및-결과-데이터-구조-설계/","previous":{"fields":{"slug":"/vue/vue-js-vuex의-개념-및-구조의-이해/"},"frontmatter":{"title":"Vue Js Vuex의 개념 및 구조의 이해","tags":["vue","javascript","framework","frontend","web","router"]}},"next":{"fields":{"slug":"/springboot/스프링-부트-controller-advice를-활용한-exception-처리/"},"frontmatter":{"title":"스프링 부트 ControllerAdvice를 활용한 Exception 처리","tags":["스프링","스프링부트","Spring","SpringBoot","Java","프레임워크","스프링부트구조","아키텍쳐","ControllerAdvice"]}}}},"staticQueryHashes":["213619243","3262363727"]}