본문 바로가기

개발

[NCP] Naver Cloud의 CDN 기능을 사용해보자 AWS를 사용한다면 CloudFront SDK를 통해 손쉽게 캐시 서버를 제어할 수 있다. 이전 포스팅에서 Naver Cloud에서 Object Storage는 S3 SDK가 호환된다고 했는데, 아쉽게도 CloudFront SDK는 CDN+(국내용) 또는 Global CDN(해외용)에 호환되지 않는다. 그렇지만 결론은 심플하다. API 방식을 사용하면 된다. 내가 필요한 기능은 CDN+ 의 데이터 삭제 기능인 "퍼지(purge)"이다. 기존에 CDN을 회원별 아이디를 디렉토리로 하여 생성하고 그 안에 대상 파일이 있는 구조이다. 요청에 필요한 파라미터를 보니, 나에게 필요한 것은 아래와 같았다. CDN 인스턴스 번호 전체 도메인 여부 전체 퍼지 여부 대상 디렉토리명 응답 타입 WebClient를 사용하여.. 더보기
[NCP] S3 SDK를 Naver 클라우드에서 사용해보자 네이버 클라우드에는 저장소로 Object Storage를 제공하고 있다. 쉽게 얘기하자면 AWS의 S3와 같은 기능을 한다고 보면 좋겠다. 현재 프로젝트는 클라우드 서비스를 AWS 환경에서만 제공하고 있었는데, 클라우드 서비스 보안인증제도(CSAP) 심사를 위해 네이버 클라우드(공공기관용)의 호환성을 가져갈 필요가 생겼다. 기존 Java, Spring 프로젝트에서는 AWS에서 제공하는 S3 SDK를 사용하여 파일 업로드를 구현하고 있었다. // build.gradle implementation 'software.amazon.awssdk:s3:2.17.239' 기존의 S3Client 생성 로직에서 분기처리를 해준다. @Component public class S3 { @Value(value = "${csp.. 더보기
[Java] Design-Pattern : ProtoType 프로토타입 패턴은 싱글톤과 같이 생성 패턴(Creathinal Patterns) 중 하나이다. 기존 인스턴스를 프로토타입으로 사용하여 복제해 새로운 인스턴스를 생성하는 디자인 패턴이다. 최상위 객체인 Object 객체의 clone() 메서드를 활용하여 객체를 복제할 수 있다. 실제 clone() 메서드를 오버라이드 하고자 한다면, Cloneable 인터페이스를 구현하면 된다. 아래와 같은 클래스가 있다고 가정하자. public class GithubIssue { private int id; private String title; private GithubRepository repository; public GithubIssue(GithubRepository repository) { this.reposit.. 더보기
[Java] Design-Pattern : Singleton(2) 이전 포스트에서 싱글턴 객체를 생성하는 기본적인 방법과, 멀티 스레드 환경에서 동시성 이슈에 대응하여 싱글턴을 생성하는 방법에 대해 알아보았다. 하지만 이렇게만 하여도 완벽하게 동일한 객체를 생성하였다고 할 수 있을까? 기존에 생성한 싱글턴 구현을 깨는 방법과 그 방법들을 막는 방안에 대해 살펴보자. 직렬화, 역직렬화를 통한 객체 생성 먼저 Settings 객체에 직렬화 인터페이스를 구현한다. public class Settings implements Serializable {} public class App { public static void main(String[] args) throws IOException, ClassNotFoundException { Settings settings = Sett.. 더보기
[Java] Design-Pattern : Singleton(1) 개발을 진행하면서 디자인 패턴에 대해 많이 듣게 된다. 특히 스프링은 컨테이너가 빈을 "싱글톤"으로 등록하여 사용한다고 하는데 지금까지는 어떠한 방법으로 싱글톤 패턴을 사용할 수 있는지, 그렇게 함으로 얻는 장점은 무엇인지 깊게 고민해보지 못한 듯 한다. 싱글톤 패턴은 객체가 오직 1개만 생성이 되는 패턴을 의미한다. 우리가 일반적으로 객체를 생성하는 방법은 new 연산자를 통해 할 수 있다. 물론 이렇게 생성한 두 객체는 동일하지 않다. public class App { public static void main(String[] args) { Settings settings = new Settings(); Settings settings1 = new Settings(); System.out.printl.. 더보기
[JPA] Cascade & OrphanRemoval 어떤 엔티티를영속 상태로 만들 때, 연관된 엔티티도 함께 영속화 하고 싶을때, cascade 옵션을 통해 영속성 전이를 할 수 있다. 먼저 부모 엔티티를 영속화 할때 CascadeType 옵션을 주면 되는데, 아래의 6가지 옵션이 있다. ALL PERSIST MERGE REMOVE REFRESH DETACH 이 중 일반적으로 사용되는 ALL, PERSIST, REMOVE로 살펴본다. 하나의 Item 엔티티가 있고, 그 안에서 Option, OptionDetail 엔티티가 있는데, Option이 부모 엔티티, OptionDetail 엔티티가 자식 엔티티이다.(편의상 Item 엔티티는 제외한다) 먼저 cascade를 설정하지 않은 경우를 보자. @Entity @Getter @Builder @AllArgsCo.. 더보기
[DB] 인덱스를 내 의도대로 설정하자 옵티마이저는 SQL의 실행계획을 만들어주는 Database의 핵심 엔진이다. 이 옵티마이저를 통해 우리는 조회 시, 최적의 속도로 결과를 얻을 수 있게 되는데, 종종 이 옵티마이저가 우리의 의도대로 동작하지 않는 경우가 있다. 예를들어 특정 select 쿼리를 수행하기 위해 analyze를 실행했다고 하자(MariaDB 기준) 분명히 사용 가능한 키가 있음에도 테이블 full scan이 발생하고 있는 것을 확인할 수 있고, 조회 대상인 row도 1만이 넘어가고 있다. 이럴 때 강제로 사용가능한 index를 수행하도록 지정할 수 있는데, 이를 Index Hint 라고 한다. Index Hint 특정 인덱스를 사용하지 않길 원하면 ignore 를, 사용하길 원하면 use 또는 force 를 사용할 수 있다... 더보기
[보안] JWT란 무엇일까 최근 웹개발에 있어 인증, 인가는 거의 JWT를 기반으로 이루어지는 것 같다. 이전에 Spring Security + JWT 도입을 통해 간단하게 사용하는 방법은 알아보았지만, JWT 그 자체에 대해서는 자세하게 적지 못한 것 같아. 이번에 조금 더 디테일하게 정리해보고자 한다. JWT(JSON Web Token) 은 Json 형태의 인증 토큰으로, 웹 표준을 따르고 있기 때문에, 대부분의 언어에서 지원된다. JWT는 https://jwt.io/ 에서 생성해볼 수 있다. JWT.IO JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties. jwt.io 먼.. 더보기