3월, 2020의 게시물 표시

[Spring Boot] REST API 문서를 Swagger로 관리하기

이미지
안녕하세요 명동역 델리만쥬입니다~! 실무에서 REST API를 개발할때면 API 관련 문서를 만들어야 합니다. API의 요청, 반환 값이 변경되거나 주소 및 API 속성이 변경되었을시에 문서를 일일이 업데이트를 해줘야 하는 번거로움이 존재합니다. 이번 포스팅에서는 API관련 명세를 만들어주는 Swagger를 써보려고 합니다!~ 기본 베이스 ( Spring  Boot, Spring MVC, AOP, Gradle을 적용한 REST API 설계 구조 ) 위의 가정 아래 시작하겠습니다! build.gradle에 아래와 같은 설정을 해줍니다. compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2' compile("io.springfox:springfox-swagger2:2.9.2") {     exclude module: 'swagger-annotations'     exclude module: 'swagger-models' } compile("io.swagger:swagger-annotations:1.5.21") compile("io.swagger:swagger-models:1.5.21") Colored by Color Scripter cs Swagger 기본 설정 위의 build.gradle의 설정이 끝난 후 Config 클래스를 생성해서 Swagger 기본 설정을 하려고 합니다. Config 디렉토리에 SwaggerConfig 클래스를 생성합니다. @Configuration @EnableSwagger2 public   class  SwaggerConfig {       @Bean      public  Docket api() {         

[Spring Boot] JPA Auditing 으로 생성/변경일시 관리하기

이미지
안녕하세요. 남산돈가스입니다. 오늘은 Spring Boot + JPA 환경에서 Auditing을 이용하여 생성/변경일시를 관리하는 법에 대해 포스팅하겠습니다. 일반적으로 테이블을 설계할 때, 거의 필수적으로 관리되는 컬럼들이 있습니다. 대표적인 예로 생성일시, 변경일시 등이 있을 것이고, 또 최종 변경자, 최초 생성자도 있을 수 있겠네요. JPA환경에서 Entity들을 관리할 때, 이 모든 Entity에서 위에서 언급한 컬럼들을 일일이 관리하기엔 번거로움이 있을 것 같습니다. 또한, 코드 레벨에서 이 데이터들의 값을 관리하기는 더 어려운 일이 아닐 수 없겠죠. 이런 불편함들을 해소하고자(?) 혹은 Spring Data JPA가 아닌 다른 프레임워크 환경에서의 ORM에서 기본적으로 제공되던 것(ex. Sequelize 등) 들을 대체해 줄 수 있는 것이 바로 Spring Data JPA의 Auditing 입니다. Auditing을 사용하기 위해서는 간단한 설정이 필요합니다. Auditing을 활성화하기 위한 적당한 이름의 Config 파일을 생성한 뒤, @EnableJpaAuditing 어노테이션을 추가합니다. @EnableJpaAuditing @Configuration public class JpaAuditingConfig { } Config를 생성한 뒤, 이제 Audity로 제공할 데이터들을 정의하는 클래스를 생성합니다. @Getter @MappedSuperclass @EntityListeners (AuditingEntityListener.class) public abstract class Audity { @CreatedDate @Column (name = "created_date" , updatable = false) private LocalDateTime createdDate; @LastModifiedDate @Column (name = "updat

[NCP] 탄력적 서버 확장을 위한 오토스케일링 구성하기 (1) - Launch Configuration 구성

이미지
안녕하세요 남산도서관 입니다. Cloud 인프라 구성의 On-premise 대비 가장 큰 장점은 장애 또는 대량 트래픽 발생 시에 자동으로 대처가 가능하며 탄력적으로 인프라를 운영할 수 있다는 점입니다. 금번 포스팅에서는 탄력적 서버 운영을 위한 핵심 서비스인 Auto Scaling 서비스 구성에 대해 알아보겠습니다. Auto Scaling 서비스를 구성하게 되면 관리자가 지정한 이벤트가 발생할 때 지정된 수량만큼 서버를 증설하거나 축소할 수 있습니다. 설정 진행을 위하여 가장 먼저 Products & Service 메뉴에서 Auto Scaling 을 선택합니다. 하위 메뉴인 Launch Configuration 메뉴 로 진입한 후 [Launch Configuration 생성] 버튼을 클릭합니다. 첫번째로 서버 이미지 를 선택 합니다. Launch Configuration 에 이미지를 등록하면 Auto Scaling 구성에 따라 서버가 생성될 때 해당 이미지를 기반으로 서버가 생성되므로 최신 백업 버전을 유지하고 있어야 합니다. 서버 이미지 백업 방법은 이전 포스팅을 참고 하시기 바랍니다. [NCP] 사용 중인 서버 이미지 생성 및 복원 내 서버 이미지 에서 원하는  서버 이미지를 선택하면 됩니다. 다음은 서버 설정 입니다. 원하는 스토리지 종류 , 서버 타입 을 선택한 후 [다음] 을 선택합니다. [init Script] 를 설정하면 서버가 최초 실행될 때 해당 스크립트를 실행합니다. (서버 재부팅 시에는 실행되지 않습니다) init Script 설정 방법은 기회가 되면 따로 포스팅 하도록 하겠습니다. 이제 Launch Configuration 이름을 입력하고 [다음] 을 선택합니다. 서버 접속 시 사용할 인증키를 선택한 후 [다음] 을 선택 합니다. 일반적으로 Auto Scaling 설정을 적용할 서버가 사용하고 있는 인증키와 동일하게 설정합니다.

Elastic Stack을 활용하여 대시보드 만들기 - 1

이미지
안녕하세요 명동역델리만쥬입니다~ 앞으로 6주간 Elastic Stack을 활용한 DashBoard를 만들어보는 시간을 가지려고 합니다. 포스팅의 방향은 Kibana에서 제공하는 컴포넌트들을 활용하여 dashboard의 구축 및 운영을 위한 전반적인 내용과 troubloshoot을 중심으로 하려고 합니다~! 검색엔진으로서 Elasticsearch 및 Architecture 등은 깊게 들어가지는 않으려고 해요~ 요즘 개발자들 사이에서 흔히들 ELK 스택이라고 표현하는데요. ELK 스택은! Elasticsearch - 데이터 검색,분석,저장 Logstach - 데이터 수집,변환,전송  Kibana - 데이터 시각화 Elastic Stack의 Workflow를 살펴보면 크게 Elasticsearch : 데이터의 Mapping 설정 Logstash : 데이터 전처리 & 전송 Kibana : Index 등록 -> 데이터 탐색 -> 데이터 시각화 -> 대시보드 제작 으로 살펴볼수 있습니다. ELK를 시작하면서 우리한테 익숙한 RDBMS, Excel에서의 속성에 대해 매핑되어 있는  Elasticsearch의 속성값에 대해 알아야 합니다! Elasticsearch의 7버전으로 접어들면서 Type에 대한 속성은 폐지되었으며! Index, Document, Field, Mapping만 기억해두시면 됩니다! Kibana 시각화의 전제조건! 1. 데이터가 Elasticsearch Index에 저장되어 있어야 한다. 2. Elasticsearch Index를 Kibana에서 등록해야 한다. 1. Index Patterns 등록 단계 ( Elasticsearch Index ) kibana -> management -> Index Patterns ->  Create  Index 

[Angular] HTTPInterceptor 를 이용하여 파일 업로드 중지하기

안녕하세요. 명동섞어찌개입니다. 오늘은 Angular 에서 파일 업로드 기능 개발 시, 원하는 시점에 파일 업로드를 중지하는 기능에 대해 알아보도록 하겠습니다. 요점은 페이지 이동이나 파일 업로드 취소 버튼을 누르는 순간, HTTPIntercepter 를 이용하여 서버에 보내는 요청을 취소하여 파일 업로드를 중지하는 기능을 만드는 겁니다! 1. HttpCancelService 를 만듭니다 실질적으로 http 요청을 취소하는 부분입니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import { Injectable } from ' @angular / core ' ; import { Subject } from ' rxjs ' ; @Injectable () export class HttpCancelService { private pendingHTTPRequests = new Subject < void >(); constructor () { } public cancelPendingRequests () { this . pendingHTTPRequests . next (); } public onCancelPendingRequests () { return this . pendingHTTPRequests . asObservable (); } } 2. 공통으로 어느 페이지에서나 호출하기 위해서 이벤트를 설정해 줍니다. 이거는 만드는 방식의 차이인데요 저는 어느 페이지에서나 접근 가능한 공통 commonCode 에 페이지 공통으로 쓸 이벤트를 하나 정의해 두었습니다. (이벤트를 쓰는 건 간편하긴 하지만 남발할 경우 ...... 권장하지는 않습니다. 프로젝트 상황에 맞게 쓰세요!) 1 ex

[NCP] 서버 보안을 위한 SSL VPN 서비스 활용하기

이미지
안녕하세요 남산도서관 입니다. 지난 포스팅에서는 NCP 콘솔 계정 보호를 위한 Sub Account  관리 방안에 대해 알아 보았습니다. 지난포스팅 확인하기 (NCP Sub Account 생성) 이번 포스팅에서는 서버 보안 접속을 위해 NCP (Naver Cloud Platform) 에서 제공하고 있는 SSL VPN (   Secure   Sockets   Layer   Virtual   Private   Network  )  서비스 사용 방법에 대해 알아보도록 하겠습니다. SSL VPN 을 활용하면 클라이언트 사용자는 가상 사설망 네트워크 권한을 할당 받아 클라우드 내부의 서버와 동일한 네트워크 환경에서 인프라를 운영 관리 할 수 있습니다. 서비스 이용 요금은 외부 접속 가능한 ID 수량에 따라 정해지며 SSL VPN을 통한 데이터 전송 요금은 기본 네트워크 전송 요금과 동일합니다. 이제 이용 방법에 대해 알아 보도록 하겠습니다. 우선 서비스 신청을 위하여 NCP 콘솔에 접속 후 Security > SSL VPN 메뉴 로 이동합니다. SSL VPN 화면에 접속 되었으면 이제 서비스 신청을 위하여 [SSL VPN 생성] 버튼을 선택해 줍니다. SSL VPN 생성을 위한 팝업이 표시됩니다. 앞서 말씀드린 요금 정책에 따라 원하시는 상품을 선택한 후 [적용] 버튼은 선택하시면 서비스 신청이 완료 됩니다.  간단한 설정을 통해 서비스 신청이 완료 되었습니다. 이제 신청된 SSL VPN 정보를 확인 하실 수 있습니다. 하지만 서비스를 이용하기 위해서 계정 등록 절차가 아직 남아 있습니다. 사용자 등록을 위해 [사용자 설정] 버튼 을 선택 합니다. 사용자 설정 화면에 필요한 정보를 입력합니다.  - Username : SSL VPN 접속 아이디   - Password : SSL VPN 접속 비밀번호  - Email, SMS : 2차 인증을 위한 이메일, 전화번호 

[Spring Boot] Pageable 커스터마이징하기

이미지
안녕하세요. 남산돈가스입니다. 지난 포스팅 [Spring Boot] JPA + Pageable 을 이용한 페이징 처리  에서 마지막 Pageable 커스터마이징에 대한 언급을 했었는데, 이번 포스팅에서 그 내용을 다루어 보려고 합니다. 일반적으로, Pageable을 파라미터로 Controller를 구현하면 Request Parameter 를 통하여 Handling 할 수 있는 파라미터는 기본적으로 page, size, sort 이렇게 세 가지 입니다. page : 조회할 페이지 번호 (default : 0) size : 한 페이지 당 조회 갯 수 (default : 20) sort : 정렬 기준 (정렬할 기준컬럼,ASC|DESC) 위와 같은 기본 설정을 가지고 Pageable 객체를 Handling 할 수 있습니다. 하지만 만약 기존 레거시 코드에서 Pageable을 사용하는 페이징처리로 이관하는 작업을 한다고 가정하면, 웹 화면에서 요청하던 기존 레거시 페이지 요청 파라미터를 전부 수정해줘야하는 번거로움이 생기게 됩니다. 저 또한 이와 같은 상황에서 Pageable 요청 파라미터를 커스터마이징하는 방식을 먼저 생각하게 되었습니다. 예제를 보겠습니다. @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { SortHandlerMethodArgumentResolver sortArgumentResolver = new SortHandlerMethodArgumentResolver(); sortArgumentResolver .setSortParameter ( "sortBy" ); s

[Spring Boot] JPA + Pageable 을 이용한 페이징 처리

이미지
안녕하세요. 남산돈가스 입니다. 오늘은 Spring Boot JPA를 이용하여 API 개발 시 간단하게 Pagination 와 Sorting을 처리할 수 있도록 도와주는 Pageable에 대해서 알아보려고 합니다. 웹 개발 시 Pagination 과 Sorting은 필수적이라 할 수 있지만, 실제 개별적으로 구현 시 번거로운 작업이 생기기 마련입니다. 또한 각 데이터베이스마다 페이징 쿼리가 다를 수 있다는 점에서 모든 요구조건을 만족하기 어려운 부분들이 존재하기 마련입니다. Spring Data JPA와 Pageable을 이용하면 이런 문제들을 아주 쉽게 해결할 수 있어 비즈니스 로직에 집중할 수 있게 도와줍니다. 우선 Pageable을 사용하여 얻을 수 있는 이점은 대표적으로 두 가지 입니다. 요건에 맞는 Pagination을 구현할 수 있다. 정렬이 필요한 데이터를 쉽게 Sorting 할 수 있다. 예제를 들어 설명하겠습니다. @Entity @Table (name= "post" ) @Getter public class Post extends Audity { @Id @GeneratedValue (strategy = GenerationType.IDENTITY) @Column (name= "id" ) private Long id; @Column (name= "title" ) private String title; @Column (length = 2000 , name= "content" ) private String content; @Column (length = 50 , name= "writer" ) private String writer; } 간단한 예제를 들기 위하여, "Post" 라는 Entity를 작성하였고, 예제를 위하여 약 20건