일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- Spring Cloud OpenFeign
- rest docs
- spring boot
- CHAR 와 VARCHAR
- OpenFeign
- ExceptionHandlerFilter
- 네이버클라우드 서버
- querydsl
- try-catch-finally
- ehcache
- asciidoctor
- REDIS
- 사이드 프로젝트
- Apple 로그인
- 도메인 주도 설계(DDD) 기반 마이크로서비스(MSA) 모델링
- 쿼리 메소드
- AutoCloseable
- Spring Reactive Programming
- 비사이드프로젝트
- Spring Security
- JWT
- @Query
- 코드로 배우는 스프링 부트 웹 프로젝트
- FeignClients
- springboot
- constant pool
- INSERT ON DUPLICATE KEY UPDATE
- async 와 await
- StringCacheKeyGenerator
- 비식별
- Today
- Total
목록전체 글 (26)
기록하기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bQh5vU/btsvlIa34ms/NpHoXXwFYPvDp6PkPS8gEK/img.png)
혼자 만들어 보려는 toy project 에는 Kotlin 을 활용해서 만들어보려고 한다. 그러기 위해서는 일단 기초적인 내용 학습과 더불어 간단한 web application 을 만들어봐야겠다고 생각을 했고, 학습을 위해 인프런 강의 2개를 수강하고 있다. 수강을 하면서 간단하게 내용을 정리해보려는데 강의 내용과 코틀린 공식 문서를 참고해서 내용 정리를 해보려고 한다. (* Kotiln 을 코틀린이라고 명시함.) Classes 먼저, Class 는 간단한데 코틀린에서는 class 라는 키워드를 활용해서 정의하며 body 가 없으면 {} 는 생략 가능하다. class Person( //기본 생성자 val name: String, var age: Int ) { Constructors 위 예시를 보면 () ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/L2rJs/btsudYMDfKe/sBJQV8Thu3LHSDUIPfDXKk/img.png)
File I/O 자바의 I/O 는 기본적으로 InputStream, OutputStream 이라는 abstract 클래스가 제공된다. 어떤 파일을 읽을 때 InputStream 의 자식 클래스로 읽고, 데이터를 쓸 때에는 OutputStream 의 자식 클래스로 쓰면 된다. 이때 꼭 기억해야 하는 메소드는 read(), close() 이며 특히 close() 의 경우 리소스를 닫을 때 사용하는 메소드로 매우 중요하다. 결국 '자원'을 쓰는 것이므로 close 를 해줘야 하며 try-catch-finally 에서는 finally 에서 close() 처리를 해줄 수 있었다. test.txt 더보기 Java File I/O test file try-catch-finally public class TryCatc..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/eG0XbH/btsts7CzEjD/5RA1kp1WMMRgkEMr2QdmUK/img.png)
String Constant Pool String 클래스는 equals() 메소드를 사용해서 비교를 해야하는데 이는 자바의 Constant Pool 이 존재하기 때문이다. Constant Pool 이란, 객체 재사용을 하기 위해 만들어진 것으로 String 의 경우 동일한 값을 갖는 객체가 있으면 이 객체를 재사용한다. 즉, Constant Pool 이라는 메모리 공간에 중복되지 않는 String 문자열을 저장하고, 해당 문자열에 접근할 때마다 메모리 주소를 반환하는데 이를 통해 메모리 공간을 절약할 수 있다. 그렇다면, 아래의 경우에는 과연 결과가 어떻게 나와야할까? String test1 = "abc"; String test2 = new String("abc"); //1) System.out.prin..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cKp2F2/btssbhuLOgB/adG1dQiJZ44aGHau5itKI1/img.png)
사이드 프로젝트에서나 사내에서 많이 적용하고 있는 OpenFeign 에 대해 그 적용 과정에서 겪었던 어려움을 정리해보고자 한다. Spring Cloud OpenFeign 먼저, OpenFeign 이란, 복잡성을 줄이고 외부 API 호출을 쉽게 할 수 있도록 지원하는 Declarative REST Client 로 다음과 같은 특징을 가진다. API 응답 캐싱 지원 URI 템플릿 표현 지원 Retry API 지원 서버 간의 통신을 하거나 외부 API 를 호출할 때 기존 프로젝트에는 RestTemplate, WebClient 등 다양한 방법으로 구현이 되어 있지만 이번에 신규 프로젝트를 구성하면서 OpenFeign 으로 설계를 진행해보았다. 구현을 하면서 예전에 OpenFeign 설정 과정에서 어려웠던 문제..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dSiEPm/btssgpL2Fdm/EVKs1Kwg9mCMBurk1Swfr0/img.png)
자바의 아키텍처를 보면 JDK 와 JRE 로 나뉘어져 있는데, JRE 는 자바를 실행할 수 있는 환경의 집합이라고 볼 수 있고 자바에서 제공하는 여러 라이브러리로 구성되어 있다. 이 중에서 GC 는 자바의 성능과도 관련이 있는데, 자동화된 가비지 컬렉터는 낮은 우선순위의 쓰레드로 동작하기 때문에 자바가 높은 성능을 낼 수 있도록 해준다. GC 란 무엇인가 먼저, JVM 이라는 용어를 이해해야 한다. JVM(Java Virtual Machine), 즉 자바 가상 머신은 자바 프로그램이 수행되는 프로세스를 의미한다. java 라는 명령어로 애플리케이션이 수행되면 JVM 위에서 애플리케이션이 동작하는 것이다. 여기서 JVM Heap 메모리와 관련하여 한 가지 주의해야할 것이 있는데, 가급적이면 maxHeapS..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cRxVk7/btssfyvYZ4t/HtCQHGMteaKxA91mGZLFi0/img.png)
Spring Webflux 를 공부하면서 Reactive Programming 에 대해 학습을 진행하였다. 그 중에서 가장 먼저, 항상 헷갈리는 개념인 동기 vs 비동기, Blocking vs Non-Blocking 에 대해 내용을 정리해보고자 한다. 내용 정리에 앞서 결론적으로 먼저 정리를 해보자면, 더보기 Caller : 호출하는 함수 Callee : 호출 당하는 함수 동기와 비동기의 차이는 Caller 가 Callee 의 결과에 관심을 가지는지 여부 Blocking 과 Non-Blocking 의 차이는 제어권을 Caller 와 Callee 중 누가 가지고 있는지 이렇게 정리할 수 있으며 위 기준에 따라 구분할 수 있다. 이제 이 내용을 바탕으로 함수 호출 관점에서, I/O 관점에서 내용을 정리해보고..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Z6H5a/btsddTH8Ar8/p3k5oJfDXEeIbFYH2K95Tk/img.png)
디프만 13기 SERVER 파트에 참여하게 되었다🥳 초반에는 팀 별로 같이 아이디어 회의를 통해 기능을 도출하는 시간이기 때문에 SERVER 파트끼리는 사용해보고 싶은 기술 스택이나 아키텍처에 대해 이야기를 나눌 시간이 주어졌다. 이번에 우리 팀에서는 헥사고날 아키텍처를 경험해보고 싶다는 의견과 + 그 내부적인 도메인을 DDD 로 설계하고 싶다는 의견이 나왔다. 그리고 멀티 모듈을 활용하여 설계를 하고 싶다는 의견을 같이 더하여 결국 하고 싶었던 것, 공부해보고 싶었던 것 다 해보자! 라는 결론이 나오게 되었다. 하고 싶은 거 다 해보기! 그러나 DDD 어떻게 설계해야 복잡성이 좀 줄어들 수 있을까? 필자는 레이어드 아키텍처만 경험을 해보고 헥사고날, DDD 를 제대로 경험한 적이 없었다. 또한 멀티 모..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bxQR1q/btssc9iXspe/wcUlDs2ZcnanGhTQ2g83G1/img.png)
비사이드 프로젝트에 13기 BE 포지션으로 참여했다. 팀 내에서 중간에 일정이 조금 딜레이가 있었어서 아직 QA 진행중이긴 하지만 그래도 좋은 경험이었기에 기록용으로 짧은 후기를 남기려고 한다. 서버 스펙 아 먼저 NCP 로 서버를 운영해가면서 서버 스펙에 대해 어떻게 구성했는지를 기록해 놓으면 다른 분들도 참고하실 수 있을 것 같아 적어보려고 한다. 처음에는 아래와 같이 가장 작은 서버를 구매해서 운영해갔는데 이는 당연히 부족했고 QA 를 시작하기 전에 서버 스펙을 올렸다. [Micro] ubuntu-18.04 vCPU 1개, 메모리 1GB, 디스크 50GB [G1] 올리기 전에 어느 정도로 구성을 하는지 궁금해서 다른 분들에게 여쭤보니 아래의 정보를 공유해주셨다. - 개발시 추천하는 최소 스펙 sta..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bmyKiz/btrWX37jtjn/kQDDHw8MoSB33kiAjLeXk1/img.png)
Spring Boot + JPA + Querydsl 적용 네이버 클라우드 Global DNS, SSL 설정 애플 로그인 구현(현재글) 이제 마지막으로 애플 로그인 구현한 것을 정리해보고자 한다. 애플 로그인은 소셜 로그인 연동 중에서 가장 어려움이 큰 기능이다. 레퍼런스도 다른 소셜 로그인보다 부족한 편이고, 공식 문서에서 해결법을 찾기도 어려움이 있다. 이번에는 이전에 구성한 여러 방법들과 더불어 주요하게 도움을 받은 여러 블로그들이 있는데 이런 전체적인 내용을 정리해보려고 한다. 애플 로그인 전체적인 구조 로그인 로직을 구현하는데 이 블로그에 의하면 크게 2가지가 있다고 한다. 그 중에서 필자가 선택한 방법은 아래와 같다. 그러면 가장 먼저 회원가입 요청이 들어온 뒤 App 에서 authorizati..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/rbfYE/btrVsIDDHgG/x7fgun0JkfBhr0q8il5guk/img.png)
비사이드 13기에 참여하게 되면서 프로젝트 세팅에서 매번 헷갈리는 내용인 Querydsl 과 애플 로그인 구현, 네이버 클라우드와 관련된 내용을 정리해보려고 한다. Spring Boot + JPA + Querydsl 적용(현재글) 네이버 클라우드 Global DNS, SSL 설정 애플 로그인 구현 Spring Boot + JPA + Querydsl 적용과 관련해서는 이미 다른 분들께서 블로그 정리를 너무나도 잘해주셨다. 그래서 블로그 작성을 고민하다가 나중에 또 세팅할 때 헷갈릴 것 같아 추후 확인을 위해 다시 정리해보려고 한다. build.gradle 설정 설정은 다음과 같이 진행을 했다. 참고로 프로젝트 환경은 아래와 같다. Spring Boot 2.7.7 Java 17 gradle 7.6 plugi..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/vg2GV/btrSZlEP83L/HthJspM69NsrWWkovQKI7k/img.png)
회사에서 매번 REST Docs 를 설정할 때마다 설정 방법이 헷갈려서 레퍼런스를 많이 찾게 된다. 이미 좋은 자료들이 많긴 하지만 프로젝트마다 그리고 회사의 환경마다 조금씩 설정을 변경해줘야하기 때문에 어려움이 있다. 특히 CI/CD 를 적용해서 젠킨스에 배포를 할 때면 배포 환경에서 MySQL 등에 접속을 막아두었기 때문에 build 시 asciidoctor 가 수행이 되면 안 된다!(이 부분이 제일 힘들었다.. gradle 작성방법이나 문법도 더 공부를 해야겠다..) 그래서 다른 블로그에서 참고한 내용에 좀 더 수정이 필요했기에 해당 내용을 추후 기억하기 위해서라도 적어보려고 한다. 프로젝트 환경 gradle 7.6 Spring Boot 2.7.5 Java 11 build.gradle 에 REST ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b4Ngbz/btrMoyW3fMr/xrRBM0Tv2BMKkJkH7yPvAK/img.png)
회사에서 프로젝트를 진행하던 중 ehcache 를 사용해야했으며 key 생성에는 StringCacheKeyGenerator 를 import 받아서 사용하고 있었다. StringCacheKeyGenerator 란, Cache 를 저장할 때 key 를 생성하는데 있어서 사용할 수 있는 방법 중 하나이다. com.googlecode.ehcache-spring-annotations 를 import 하여 사용할 수 있으며 CacheManager 를 활용하여 cache 를 생성할 때 Bean 으로 주입받은 해당 객체를 사용하여 generateKey 메소드로 cache 를 저장할 수 있다. 하지만 프로젝트에서 org.springframework.boot:spring-boot-starter-cache 와 함께 사용하기..