티스토리

Software Engineer, Java, Spring Boot, JAX-RS REST API, OAuth 2.0, Microservice, DevOps
검색하기

블로그 홈

Software Engineer, Java, Spring Boot, JAX-RS REST API, OAuth 2.0, Microservice, DevOps

jsonobject.tistory.com/m

미니멀리스트 Senior Software Engineer Java, Spring Boot, JAX-RS REST API, OAuth 2.0 Microservice, DevOps

구독자
40
방명록 방문하기
공지 처음 오신 분들을 위한 바로 가기 모⋯ 모두보기

주요 글 목록

  • Spring Boot, ShedLock, 멀티 노드 환경에서 특정 스케쥴 작업의 중복 실행 방지하기 개요 Spring Boot에서 특정 빈의 메써드에 지정된 @Scheduled는 특정 시간 또는 주기로 애플리케이션 로직이 실행될 수 있도록 해준다. @Scheduled에서 발생할 수 있는 주요 이슈로, 분산 시스템의 개념이 없기 때문에 애플리케이션을 n개의 멀티 노드에 배포하면 같은 스케쥴 작업이 n개 노드에서 동시에 실행된다는 단점이 있다. 어떤 상황에서는 특정 스케쥴 작업이 반드시 1개 노드에서만 실행되어야 하는 경우가 있는데, 이번 글에서 소개할 SchedLock 라이브러리를 이용하면 특정 작업 실행시 락을 생성하여 다른 인스턴스에서는 해당 작업의 실행을 무시하도록 설정할 수 있다. DynamoDB 테이블 생성 ShedLock은 락 정보를 저장할 테이블로 여러 저장소를 지원한다. 이번 글에서는 Dy.. 공감수 4 댓글수 1 2024. 1. 10.
  • Spring Boot, JPA, LazyInitializationException 예외 설명 및 해결책 정리 개요 Spring Boot, JPA 환경에서 개발하다보면 JPA의 멋진 철학에 매료되었다가 곧 현실과의 괴리를 느끼고, 끊임없는 내적 갈등에 휩싸이게 된다. 그런 상황을 유발하는 대표적인 예외가 바로 LazyInitializationException인데 이번 글에서는 해당 예외가 발생하는 이유와 해결책을 정리하였다. LazyInitializationException 예외가 발생하는 이유 일반적인 백엔드 프로젝트에서 로직의 대부분은 REST API에 해당하며 실행의 흐름은 @Controller, @Service, @Repository 순서가 된다. 서비스 레벨에서 @Transactional이 명시된 메써드가 종료되면 Hibernate의 Session도 함께 종료된다. FetchType.LAZY가 설정된 필.. 공감수 2 댓글수 2 2022. 7. 4.
  • Spring Boot, REST API 예외 응답 구조 설계하기 개요 Spring Boot 기반의 REST API를 설계할 경우, 예외 상황에 대한 응답 구조 설계에 있어 신중한 접근이 요구된다. 프로젝트 초기에 충분한 고민 없이 무작정 오류 응답을 처리하게 되면, 참여 개발자가 늘어날수록 자기 입맛에 따라 그 때 그 때 다른 구조로 응답하여 예외를 통제하기가 매우 힘들어진다. (나는 이런 사례를 Exception Hell이라고 부른다.) 이번 글에서는 철저히 통제된 예외 응답 구조를 설계하는 방법을 설명하고자 한다. Spring Boot의 기본 에러 응답 Spring Boot의 요청 처리 과정에서 어떠한 설정도 하지 않은채 예외가 발생하면 아래 형식으로 오류를 응답한다. # 400 BAD_REQUEST { "timestamp": 1500597044204, "stat.. 공감수 2 댓글수 2 2022. 7. 4.
  • Spring Boot, Spring Cache, Infinispan 연동하기 개요 JBoss Infinispan에 대해서는 본 블로그의 이 글에서 자세히 소개한 적이 있다. 이번 글에서는 여러 캐시 라이브러리가 공존하는 복잡한 프로젝트 환경에서 JBoss Infinispan을 추가하고, Spring Cache와 JCache를 연동하는 방법을 정리하였다. Spring Cache 적용 원리 프로젝트의 @Configuration 빈의 클래스 레벨에 @EnableCaching을 명시하면, 전처리기가 활성화되어 모든 스프링 빈의 퍼블릭 메써드 레벨에 명시된 @Cacheable, @CachePut, @CacheEvict를 확인하여 캐시가 작동하게 된다. 스프링 캐시는 별도의 설정을 하지 않고 활성화할 경우, 단순히 CuncurrentHashMap 오브젝트를 캐시로 사용하게 된다. Infin.. 공감수 1 댓글수 0 2021. 12. 28.
  • Spring Boot, 콘솔 애플리케이션을 만드는 노하우 정리 개요 Spring Boot 생태계에서 콘솔 애플리케이션을 만드는 방법은 다양하지만, 내가 선호하는 방법을 정리하였다. (대부분은 팀 내부에서 사용하는 유틸리티 성격의 툴링이 목적이다.) build.gradle.kts 웹 애플리케이션이 아닌 한 번 실행되면 준비된 기능을 실행하고 종료되는 애플리케이션을 만들 것이기 때문에 spring-boot-starter이면 충분하다. dependencies { implementation("org.springframework.boot:spring-boot-starter") } @SpringBootApplication 클래스 작성 커맨드라인 인자를 다루면 좋겠지만 팀 내에서만 사용할 것이기에 운영체제 환경 변수 주입을 더 선호한다. import org.springframe.. 공감수 1 댓글수 0 2021. 12. 27.
  • Spring Boot, DynamoDB, @Repository 클래스 작성하기 개요 Spring Boot 기반 프로젝트에서 DynamoDB를 사용하기 위한 @DynamoDbBean 클래스를 작성하는 방법을 정리하였다. 사전 요구 지식 Spring Boot, DynamoDB 사용을 위한 @Configuration 클래스 작성하기 Spring Boot, DynamoDB 사용을 위한 @DynamoDbBean 클래스 작성하기 @Repository 빈 설계 예 import org.springframework.stereotype.Repository import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable impor.. 공감수 0 댓글수 0 2021. 12. 22.
  • Spring Boot, DynamoDB, @DynamoDbBean 클래스 작성하기 개요 Spring Boot 기반 프로젝트에서 DynamoDB를 사용하기 위한 @DynamoDbBean 클래스를 작성하는 방법을 정리하였다. 사전 요구 지식 Spring Boot, DynamoDB 사용을 위한 @Configuration 클래스 작성하기 @DynamoDbBean 빈 설계 예 @DynamoDbBean 는 JPA의 @Entity와 동일한 역할을 수행하는 빈을 작성할 때 명시한다. 실제 DynamoDB의 물리 테이블을 맵핑하는 역할을 해준다. 따라서 실제 테이블에 설계된 Primary Key와 Secondary Index가 정확하게 반영되어야 한다. 아래는 환율과 국가 코드에 따른 일간 환율 정보를 저장하는 테이블에 맵핑되는 빈의 작성 예이다. import software.amazon.awssdk.. 공감수 0 댓글수 0 2021. 12. 22.
  • Spring Boot, DynamoDB, @Configuration 클래스 작성하기 개요 Spring Boot 기반 프로젝트에서 DynamoDB를 사용하기 위한 @Configuration 클래스를 작성하는 방법을 정리하였다. 별도의 ODM 라이브러리를 쓰지 않고, AWS에서 권장하는 DynamoDB Enhanced Client 라이브러리를 사용하였다. build.gradle.kts 프로젝트의 /build.gradle.kts에 아래 내용을 추가한다. dependencies { implementation("software.amazon.awssdk:dynamodb-enhanced:2.17.101") } application.yml 프로젝트의 /src/main/resources/application.yml에 아래 내용을 추가한다. cloud: aws: credentials: access-key.. 공감수 0 댓글수 0 2021. 12. 22.
  • Spring Boot, Maven 기반 프로젝트에서 로컬 .JAR 라이브러리 추가하기 개요 일정에 쫓겨 프로젝트를 진행하다보면, 사용된 주요 라이브러리의 버그로 예상하지 못한 이슈에 봉착할 때가 있다. 이 경우, 선택지는 2개인데 첫번째, 라이브러리 저장소를 포크해서 이슈를 수정한 제작자에게 PR을 요청하고 기다리는 것, 두번째, 일단 급한대로 내가 직접 고쳐서 로컬 .JAR로 빌드하는 것이다. 이번 글에서는 두번째 방법을 위한 Maven 기반 프로젝트에 로컬 .JAR 파일을 추가하는 방법을 설명하고자 한다. 라이브러리 커스텀 빌드 아래는 이슈를 수정할 라이브러리를 클로닝하여 커스텀 빌드하는 예이다. # JobRunr 라이브러리 저장소 클로닝 $ git clone https://github.com/jobrunr/jobrunr # 이슈 수정 후 커스팀 빌드 # 생성된 .jar 파일은 내 프.. 공감수 0 댓글수 0 2021. 12. 15.
  • Spring Boot, HikariCP, 로그 레벨 조정으로 이슈 원인 식별하기 개요 HikariCP는 현재 Spring Boot에서 기본으로 채택하고 있는 경량이자 고성능의 JDBC 커넥션 풀 라이브러리이다. 물리 데이터베이스 노드와 연계되다보니 운영 환경에서 다양한 이슈가 발생하게 되는데 정확한 원인 식별과 문제 해결을 위해 HikariCP의 로그 레벨을 설정하는 방법을 설명하고자 한다. 로그 레벨 조정 운영체제 환경 변수로 전달할 경우 아래와 같이 설정하면 된다. LOGGING_LEVEL_COM_ZAXXER_HIKARI_HIKARI_CONFIG=DEBUG LOGGING_LEVEL_COM_ZAXXER_HIKARI=TRACE 프로젝트 내의 application.yml 파일로 설정할 경우 아래와 같이 설정하면 된다. logging.level.com.zaxxer.hikari.Hikar.. 공감수 0 댓글수 0 2021. 12. 15.
  • Spring Boot, JPA, 커넥션 풀을 read-write, read-only로 분리하기 개요 MySQL 데이터베이스의 Master-Slave 레플리케이션은, 조회만 발생하는 트랜잭션은 복수개의 Slave 노드로, 조회 뿐만 아니라 데이터베이스 변경점이 발생하는 트랜잭션은 1개의 Master 노드로 요청되어야 한다. 이번 글에서는 Spring Boot, JPA 환경에서 커넥션 풀을 read-write, read-only로 분리하는 방법을 설명하고자 한다. 특히, Amazon Aurora MySQL의 Single-Master 레플리케이션을 사용할 경우, 최대 15개의 레플리카 인스턴스를 운영할 수 있는데 애플리케이션 레벨에서 read-only 트랜잭션을 레플리카 엔드포인트를 바라보도록 설정하면 조회 성능을 크게 향상시킬 수 있다. 기본 흐름 어노테이션에 따라 커넥션 풀을 분기해주는 클래스를 직.. 공감수 0 댓글수 0 2021. 12. 14.
  • Spring Boot, 프로젝트 생성하기 개요 Spring Boot는 Java, Kotlin 진영에서 가장 많이 사용되고 있는 프레임워크이다. 이름에서 드러나듯이 국내에서 가장 사랑 받는 Spring 프레임워크를 기반으로 한다. 경쟁자로 역시 뒤지지 않는 막강한 기능의 Dropwizard가 존재하지만 국내에서는 친숙하지 않은 JAX-RS를 기반으로 하여 앞으로도 국내에서 많이 쓰이지는 않을 것으로 생각된다. (나는 2015년 국내 모 영화 포탈 서비스의 일부를 JAX-RS 기반의 Jersey로 개발하며 상당한 생산성 향상을 경험한 적이 있다. 문제는 후에 담당한 운영 인력이 익숙치 않은 문법에 어려움을 겪었다고 한다.) 이후로는 Kotlin + Spring Boot 조합으로 소속한 회사의 백엔드 서비스를 개발하고 있는데 매번 그 편리함에 감탄하.. 공감수 5 댓글수 0 2021. 11. 15.
  • Spring Boot, @Async 비동기 실행 로직 구현하기 개요 Spring Boot 기반의 웹 애플리케이션은 기본적으로 각 요청에 대해 동기 방식으로 로직을 실행한다. 하지만, 필요에 따라 비동기 방식으로 로직을 실행해야 하는 경우도 있다. 예를 들면 I/O 부하가 많이 발생하는 배치 작업을 싱글 쓰레드로 처리하면 CPU와 메모리는 남아도는데, 병목이 생겨 느려지기 쉽상이다. 이런 경우 적절히 n개의 멀티 쓰레드로 쪼개어 배치 작업을 실행하면 처리 시간을 경우에 따라 드라마틱하게 단축할 수 있다. 이번 글에서는 이러한 사례를 해결하기 위한 비동기 방식의 실행 방법에 대해서 설명하고자 한다. RejectedExecutionHandler 구현체 작성 ThreadTaskExecutor에 의해 관리되는 쓰레드 풀의 가용 쓰레드가 한계치에 도달할 경우, TaskReje.. 공감수 2 댓글수 2 2021. 5. 4.
  • Spring Boot, Kotlin, Google Drive/Sheets API로 공유 파일 제어하기 개요 Google Drive는 구글의 클라우드 파일 저장소 상품이며, Google Sheets는 클라우드 스프레드시트 상품이다. 이번 글에서는 Google Drive/Google Sheets의 특정 계정에 업로드된 파일/시트를 UI 없이 완전히 프로그램으로 다운로드/제어할 수 있는 방법을 소개하고자 한다. 구현 시나리오 개발자는 구글이 제공하는 웹 콘솔에서 서비스 계정(Service Account)를 생성한다. 생성 후 .json 파일을 다운로드하여 프로젝트에 사용하기 위해 추가한다. 사용자는 자신의 구글 드라이브에서 애플리케이션에 공유할 파일에 위 개발자가 생성한 서비스 계정을 공유 계정을 추가한다. (공유할 계정 이름은 앞서 다운로드한 .json 파일의 client_email 값이다.) 개발자는 Go.. 공감수 1 댓글수 0 2021. 3. 29.
  • Spring Boot, RabbitMQ 비동기 통신 구현하기 개요 백엔드에서의 통신 방법은 요청에 대해 즉시 응답하는 동기식 통신이 일반적이지만, 비동기 통신 또한 백엔드 아키텍쳐에서 중요하다고 말할 수 있다. 갑작스럽게 요청이 집중되는 명절 기차표 예매, 대학교 수강신청 등이 비동기 통신이 요구되는 대표적인 사용 사례라고 볼 수 있다. (이를 동기식으로 처리하면 백엔드와 데이터베이스에 엄청난 부하가 발생한다.)RabbitMQ는 AMQP(플랫폼 독립적인 비동기 메시징을 다룬 프로토콜)을 준수하여 제작된 메시지 브로커이다. 설치가 쉽고, 기능이 직관적인데다 성능이 뛰어나기 때문에 현재 비동기 메시징에 있어서는 광범위하게 사용되고 있다. 이번 글에서는 Spring Boot에서 RabbitMQ 사용 방법을 소개하고자 한다. AMQP 통신 원리 AMQP에서는 브로커의 양.. 공감수 1 댓글수 0 2021. 3. 19.
  • Spring Boot, Kotlin, 로깅 정책 수립 및 방법 정리 개요 로그는 매우 중요하다. 나는 감히 로그가 애플리케이션의 시작과 끝이라고 단언할 수 있다. 잘 설계된 로그는 빠른 장애 대응 뿐만 아니라 회사 매출과도 직결되는 유의미한 데이터로서도 활용될 수 있다. Spring Boot의 로깅은 기본적으로 SLF4J 인터페이스를 기반으로 하여 Logback을 구현체로 작동하도록 설계되어 있다. 이번 글에서는 여기에 더하여 Kotlin 환경에서 kotlin-logging을 이용하여 로깅 정책을 수립하고 로그 적재의 예를 설명하고자 한다. SLF4J 로그 레벨의 이해 로그 레벨을 명확히 이해하면 개발환경, 운영환경 단위로 어느 수준으로 로그를 남길지를 결정할 수 있다. 로그 레벨은 계층 구조로서 아래와 같다. (상위 계층은 하위 계층을 모두 포함하기 때문에 상위로 갈수.. 공감수 4 댓글수 0 2021. 3. 18.
  • Spring Boot, Spring Data MongoDB, Querydsl로 타입 세이프 쿼리 작성하기 개요 곰곰히 생각해보면 백엔드 개발에 쏟는 시간의 대부분은 원격지 데이터베이스에 대한 CRUD라고 할 수 있다. RDBMS의 경우 Spring Boot, Spring Data JPA, Querydsl 조합을 이용하면 직관적이고 높은 생산성으로 개발에 집중할 수 있다. (MySQL/MariaDB 연동 방법은 본 블로그의 이 글에 소개한 적이 있다.) 이번 글에서는 MongoDB에도 동일한 기술 스택을 적용하는 방법을 소개하고자 한다. MongoDB 로컬 인스턴스 실행 아래는 예제를 실행하기 위한 목적의 MongoDB 로컬 인스턴스를 실행하는 예이다. (자신이 선호하는 다른 방법으로 실행해도 무방하다.) # MongoDB 도커 컨테이너를 실행 $ docker run -d --name mongodb -p 27.. 공감수 3 댓글수 0 2021. 3. 17.
  • Spring Boot, SSE(Server-Sent Events)로 단방향 스트리밍 통신 구현하기 개요 Server-Sent Events(이하 SSE)는 HTTP 스트리밍을 통해 서버에서 클라이언트로 단방향의 Push Notification을 전송할 수 있는 HTML5 표준 기술이다. 이번 글에서는 Spring Boot에서 SSE를 이용한 단방향 스트리밍 통신 방법을 실제 운영 프로덕션 레벨 관점에서 설명하고자 한다. 특징 전통적인 웹 애플리케이션이라면 클라이언트의 요청 단건에 대해 서버가 응답하는 방식이지만 SSE를 이용하면 별도의 복잡한 기술이 필요없이 HTTP 프로토콜을 기반으로 서버에서 클라이언트로 Real-Time Push Notification을 전송할 수 있다. 클라이언트의 요청에 의해 한 번 연결이 맺어지면 서버가 원하는 시점에 클라이언트에게 원하는 메시지를 전송할 수 있다. 이러한 특.. 공감수 9 댓글수 2 2021. 3. 3.
  • Spring Boot, Docker 이미지 빌드하기 개요 이번 글에서는 Spring Boot 기반 애플리케이션을 Docker 이미지로 빌드하는 방법을 소개하고자 한다. 사전 참고할만한 글 choco, Windows 패키지 관리자 설치하기 CentOS 7, Docker 및 Docker Compose 설치하기 Docker 이미지 빌드 및 실행 아래는 가장 일반적인 방법의 Docker 이미지 빌드 및 실행 방법이다. ### 애플리케이션 빌드 $ ./gradlew build # Dockerfile 생성 $ nano Dockerfile FROM amazoncorretto:17 # FROM public.ecr.aws/bitnami/java:17-prod ARG JAR_FILE=build/libs/*.jar COPY ${JAR_FILE} app.jar ENV JAVA.. 공감수 2 댓글수 0 2020. 11. 10.
  • Kotlin, Spring Boot 2.3.x로 버전 업그레이드하기 개요 Spring Boot 2.3.x는 이전 버전 대비 Docker 이미지 자체 빌드와 같은 굵직한 신규 기능이 여럿 추가되었다. 24시간 운영 중인 Kotlin, Spring Boot 프로젝트에 새로운 버전을 적용하기까지 유독 이전과 다르게 많은 시간을 할애하며 다양한 트러블슈팅을 해야 했는데, 잊지 않고자 관련 내용을 정리하고자 한다. 버전 업그레이드 작업 Spring Boot 2.3.x 버전 업그레이드를 위한 첫 작업이다. 프로젝트 루트의 /build.gradle 파일의 아래 내용을 수정한다. buildscript { ext { kotlinVersion = '1.4.10' springBootVersion = '2.3.5.RELEASE' querydslVersion = &.. 공감수 1 댓글수 0 2020. 9. 23.
  • Spring Boot, Amazon S3 버킷에 파일 업로드, 다운로드하기 개요 Amazon S3는 서버리스 오브젝트 저장소 상품이다. 이번 글에서는 Spring Boot 기반 애플리케이션에서 Amazon S3에 파일을 업로드하고 다운로드하는 방법을 설명하고자 한다. 사전 조건 Amazon S3를 제어할 수 있는 IAM 사용자 계정이 생성되어 있어야 한다. Amazon S3 비공개 버킷 생성 아래는 Amazon S3의 비공개 버킷을 생성하는 예이다. (이름 그대로 비공개 버킷은 외부에서 접근이 불가능하다.) Amazon S3 콘솔 접속 → [버킷 만들기] 클릭 # 버킷 만들기 → 버킷 이름: foobar-dev (입력) → AWS 리전: [아시아 태평양(서울) ap-northeast-2] 선택 # 이 버킷의 퍼블릭 액세스 차단 설정 → [모든 퍼블릭 액세스 차단] 체크 (기본값.. 공감수 2 댓글수 0 2020. 7. 14.
  • Spring Boot, HttpServletRequest 객체에서 요청 바디 획득하기 개요 클라이언트로부의 요청 정보를 담은 HttpServletRequest 객체에는 요청 바디를 반환하는 getInputStream() 메써드가 존재한다. 하지만 이 메써드는 최초 1회 호출 후에는 재호출시 java.io.IOException: Stream closed. 예외를 발생시킨다. 일반적인 상황에서는 문제가 없지만 로깅 등의 목적으로 요청 바디를 획득하고자 할 경우 접근이 불가능한 문제가 발생한다. 이 경우 getInputStream()을 재호출이 가능한 별도의 커스텀 HttpServletRequest를 제작해야 한다. 요청 바디의 재접근이 가능한 HttpServletRequest 작성 요청 바디의 재접근이 가능한 커스텀 HttpServletRequest 클래스를 아래와 같이 작성한다. (소스 코.. 공감수 2 댓글수 2 2020. 7. 9.
  • CentOS, Sphinx 3, 오픈 소스 풀텍스트 검색 서버 설치하기 개요 Sphinx(스핑크스)는 C++ 기반의 무료 오픈 소스 풀텍스트 검색 서버이다. Sphinx의 장점은 쉬운 설치와 사용법에 있다. 특히, 애플리케이션 입장에서는 기존의 MySQL/MariaDB와 동일한 방법으로 스핑크스에 연결하여 SQL과 유사한 쿼리로 인덱스에 대한 CRUD를 수행할 수 있어 매우 편리하다. (이러한 접근 방식을 SphinxQL이라 부른다.) Sphinx 3 설치 아래는 CentOS 7 운영체제에 Sphinx 3(2020-01-31에 공개된 3.2.1 기준)를 설치하는 예이다. 가장 먼저 로컬에 위치한 Sphinx에서 MySQL/MariaDB 원격 서버에 연결하기 위한 클라이언트를 설치할 차례이다. ### 인덱스 대상이 되는 MySQL/MariaDB 원격 서버에 연결하기 위한 클라.. 공감수 1 댓글수 0 2020. 3. 22.
  • Spring Boot, JPA, @MappedSuperClass로 코드 중복 최소화하기 개요 물리적으로 서로 다른 데이터베이스인데, 테이블 스키마는 완전히 동일하게 적용하여 운영 중인 2개의 레거시 애플리케이션이 있다고 가정하자. 이러한 2개의 서로 다른 데이터베이스를 한 애플리케이션에서 JPA를 이용하여 동시에 접근해야할 경우, 코드 중복을 최소화하는 방법을 고민하고 정리하였다. 사전지식 Spring Boot 환경에서 JPA를 적용하는 방법은 본 블로그의 이 글을 참고한다. @MappedSuperClass 적용 @MappedSuperClass은 테이블 구조에 있어 많은 컬럼을 공통적으로 공유하면서 부분적으로 다른 컬럼이 존재하는 서로 다른 테이블을 엔티티로 구현하기 위해 고안된 JPA 어노테이션이다. 따라서 완전히 동일한 구조의 서로 다른 테이블에도 적용할 수 있다. 적용 예는 아래와 같.. 공감수 1 댓글수 2 2019. 10. 17.
  • Spring Boot, Pebble 템플릿 뷰 적용하기 Spring Boot, Pebble 템플릿 뷰 적용하기 Pebble은 PHP 개발자가 PHP의 유명한 템플릿 엔진인 Twig에 영감을 받아 만든 Java 진영의 템플릿 엔진이다. 간결한 문법과 기본기로 최근 서버 사이드 템플릿으로서의 점유율을 높이고 있다. 요즘 프론트엔드 개발이 SPA로 완전히 트렌드가 변화하면서 서버 사이드 진영의 템플릿들은 과거의 것으로 취급 받는 느낌이 있다. 하지만, SPA 기반의 프로젝트에서도 서버에서의 템플릿 엔진 처리는 여전히 필요하다. 때때로 간단한 목적의 프로젝트를 제작하기에는 템플릿 엔진이 더 생산적으로 효과적인 경우도 있다. 본 글에서는 Spring Boot에서 사용 가능한 Pebble 템플릿 엔진의 사용법을 소개하고자 한다. 라이브러리 종속성 추가 프로젝트 루트의 .. 공감수 1 댓글수 0 2019. 9. 28.
  • Spring Boot, APNs, 푸시 서버 제작하기 개요 애플이 제공하는 APNs를 이용하면, 내가 제작한 앱이 설치된 애플의 제품군에 해당하는 모든 기기에 메시지를 전송할 수 있다. 이번 글에서는 Kotlin, Spring Boot 기반 프로젝트에서 APNs를 이용한 메시지 전송 방법을 설명하고자 한다. 관련 용어 메시지를 전송하려면, 대상이 되는 기기 각각을 식별할 수 있는 고유의 식별 문자열이 요구된다. 이를 Device Token이라고 부른다. (FCM에서는 FCM Token이라고 부르는 것과 같은 개념이다.) 일반적으로 앱은 자신이 실행 중인 기기의 Device Token을 앱 서버로 전송하고, 이를 수집한 앱 서버가 알람 등의 메시지를 각 기기로 전송하는 방식으로 운영된다. 이 때 앱 서버는 애플이 제공하는 APNs 서버에 메시지를 전송하여 메.. 공감수 2 댓글수 1 2019. 9. 10.
  • Spring Boot, FCM, 푸시 서버 제작하기 개요 구글이 제공하는 Firebase Cloud Messaging(FCM)을 이용하면, 서버와 같은 외부에서 내가 소유한 앱이 설치된 기기로 1개 이상의 메시지를 전송할 수 있다. FCM은 완전히 무제한으로 무료 제공된다. 크로스 플랫폼을 지원하여 Android, iOS, Chrome 기기에 메시지를 전송할 수 있다. 이번 글에서는 Kotlin, Spring Boot 기반 프로젝트에서 FCM을 이용한 메시지 전송 방법을 설명하고자 한다. 관련 용어 메시지를 전송하려면, 대상이 되는 기기 각각을 식별할 수 있는 고유의 식별 문자열이 요구된다. 이를 FCM Token이라고 부른다. (APNs에서는 Device Token이라고 부르는 것과 같은 개념이다.)앱 이외의 애플리케이션에서 FCM을 이용하여 1개 이상.. 공감수 3 댓글수 0 2019. 9. 9.
  • Spring Boot, AWS 파라메터 스토어에 저장된 프라퍼티 소스 주입하기 개요 AWS 생태계에서는 AWS 파라메터 스토어를 통해 중요한 정보를 은닉할 수 있다. 이를 통해 소스 코드에 중요한 정보를 공개하지 않고, 애플리케이션 배포 후의 기동 단계에서 이 정보들을 주입함으로서, 소스 코드 유출시에도 보안 위협으로부터 시스템 자원을 보호할 수 있다. 라이브러리 종속성 추가 프로젝트의 /build.gradle에 아래 내용을 추가한다. 해당 라이브러리가 org.springframework.boot.env.EnvironmentPostProcessor로 작동하여 AWS 파라메터 스토어를 통한 프라퍼티 주입을 수행해준다. dependencies { compile group: 'com.coveo', name: 'spring-boot-parameter-store-int.. 공감수 1 댓글수 0 2019. 8. 8.
  • Spring Boot, Spring Security, 사용자 역할, 권한 인증하기 목표 및 기대효과 Spring Boot 기반 프로젝트에 Spring Security를 이용하여 시스템에 대한 사용자 접근 제어를 손쉽게 구현할 수 있다. 사용자 사용자(UserDetails)는 시스템을 이용하는 사용자를 의미한다. Spring Security는 사용자를 대표하는 org.springframework.security.core.userdetails.UserDetails 인터페이스, 사용자 인증 관련 기능을 제공하는 org.springframework.security.core.userdetails.UserDetailsService 인터페이스를 제공한다. 시스템마다 사용자를 이루는 요소와 방법이 다양하기 때문에 인터페이스로 추상화하고 각자 입맛에 맞게 구현체를 개발하도록 설계되어 있다. 역할(Ro.. 공감수 0 댓글수 0 2019. 7. 5.
  • Spring Boot, @PathVariable 사용법 정리 @PathVariable @PathVariable 파라메터를 사용하면 아래와 같이 URI의 일부를 변수로 전달할 수 있다. @GetMapping("/bars/{barId}") fun getBar(@PathVariable(value = "barId") barId: Optional) @PathVariable 파라메터는 생략이 불가능하다. 생략할 경우 404 Not Found 오류로 분기된다. 생략을 허용하려면 아래와 같이 생략된 엔드포인트 URI를 추가하면 된다. @GetMapping(value = ["/bars","/bars/{barId}"]) @PathVariable 파라메터 타입으로 Optional을 사용하면 옵셔널 체크를 좀 더 우아하게 표현할 수 있다. [관련 링크]@PathVariable 파라메터.. 공감수 1 댓글수 1 2019. 6. 19.
    문의안내
    • 티스토리
    • 로그인
    • 고객센터

    티스토리는 카카오에서 사랑을 담아 만듭니다.

    © Kakao Corp.