-
Spring
JPA를 이용하여 cursor 기반 페이징 구현
언젠가부터 무한 스크롤을 이용한 페이징 방식이 우리들에 스며들기 시작했다. 이는 과거의 1, 2, 3... 의 페이지를 클릭하여 다음 콘텐츠를 보는 것이 아니라, 페이스북처럼 마지막 콘텐츠를 보게 되면 다음 페이지가 로딩되어 보이는 것을 의미한다. 그러나 SNS에서는 일반적으로 사용하는 Offset 기반의 페이징을 사용하게 되면 문제가 생길 수 있다. Offset Based Pagination SELECT * FROM BOARDS ORDER BY ID DESC LIMIT 0..
-
Spring
Spring WebFlux는 어떻게 적은 리소스로 많은 트래픽을 감당할까?
위 그림은 DZone 게시글 중 하나인 Spring WebFlux를 이용한 Boot2와 Spring MVC를 이용한 Boot1을 비교한 그래프이다. 해당 그래프에서는 두 가지 특징을 볼 수 있다. 첫 번째로는 유저가 적을 때에는 성능에 별반 차이가 없다. 두 번째로는 유저가 늘어나면 늘어날수록 극명한 성능 차이를 보여주고 있다. 어떻게 이런 차이가 일어날 수 있을까? 본글은 아래의 구성을 가지고 있다. I/O Event-Driven Spring Framework 먼저,..
-
Diary
Ahea 2019 상반기 세미나 회고
Ahea 2019 상반기 세미나 작년에 이어 생애 두 번째 세미나의 발표자로 서게 되었다. 원래 작년 하반기에도 IoC를 주제로 발표를 준비했지만 스터디 그룹의 여건상 불발되었다. 이후 스터디 그룹 내실을 다져 2019.05 중으로 발표 계획을 잡았고, 다시 주제부터 시작해서 발표 준비를 하기로 했다. 공식적인 스터디는 2019.02부터 시작하게 되었다. (물론 2, 3월은 큰 다짐만 하고 4월부터 본격적으로 진행을 했다) 처음에는 DD..
-
Spring
Spring Cache 구현 원리
Spring Cache 구현방식에 대해서 살펴보자. 최근 회사에서 spring-cache의 @Cacheable 을 사용하게되었다. 사용하다 보니 토비의 스프링에서 본 관심사의 분리와 AOP와 겹쳐서 머릿속의 생각을 코드와 글로 써보려 한다. 글로 다 표현하기에는 한계가 있는 듯하니 Github source와 함께 보면 좀 더 도움이 될 것 같다. 그리고 Test code도 작성하였으니, 이걸통해서 Test를 하면 될 것 같다. (단, cache의 유무만 중요하기에..
-
Spring
Dubbo Spring Boot
Apache Dubbo 고성능, 가벼운 Java 기반 오픈 소스 RPC 프레임워크 Interface 기반의 원격 호출(remote call) fault tolerance, load balancing Service 자동 등록 및 감지 (Service Registry) RPC란? Remote Procedure Call 외부 서비스를 함수나 메소드를 통해 호출하는 형태 부가설명 분산서비스시 외부 서비스는 주로 HTTP를 통해 호출을 한다. 그리고 Application 레벨에서 header, body를 조작한다. 그러나 RPC는 마치 메..
-
Java
BigDecimal의 toString(), toPlainString(), toEngineeringString()
BigDecimal 먼저 BigDecimal 에 대해서 간단히 알아보도록 하자. BigDecimal 은 큰 수를 표현하거나 부동소수점을 해결할 수 있는 클래스이다. 거두절미하고 코드를 보자. @Test public void primitive() { System.out.println(2.0 - 1.1); } 위 코드에서는 무엇이 출력이 될까? 0.9가 나오길 기대하겠지만, 위코드는 0.8999999999999999 라는 이상한 값을 반환한다. 자바 기본서를 보던 옛날로 돌아가보자. 우리는 첫장에서 pr..
-
Programming
IoC (DI, Service Locator...)
IoC Inverse of Control는 제어권을 개발자가 아닌 제 3자가 가지게 하는 것이다. 그렇다면 우리는 왜 제어권을 3자에게 위임해야 하는가? 이에 대한 답을 찾기전에 과거로 돌아가보자. 과거 많은 형태의 오픈소스들이 나오고 있었고, 이들의 공통적인 이슈는 서로 다른 객체를 어떻게 연결할 것인지에 대한 문제였다. 이를 해결할 한 가지 방법으로 IoC가 제시되었다. 즉, IoC의 주된 목적은 Application의 Dependency를 제거해..
-
Programming
Spring Boot + ELK + Redis
분산서비스는 여러개의 서비스가 존재한다. 그래서 서비스 수마다 로그가 분산되어서 각 서버에 저장이 된다. 이는 운영시 특정 로그를 볼 때 불편하기 마련이다. 그래서 우리는 분산된 로그를 ELK의 도움이 받아 로그를 모아보려한다. Service 먼저 3개의 서버가 존재하고, 각 서버에 Spring Applcation, logstash(shipper)가 설치되어 있다. 각 Spring Application은 log파일을 생성하고, logstash는 생성된 log파일을 읽은..
-
Spring
AOP에 걸린 Method의 Parameter 이름 가져오기
먼저, AOP가 뭔지에 대해 알아보자. Aspect-Oriented Programming 이란 프로그램 구조에 대해 또 다른 사고방식을 제공함으로써 Object-Oriented Programming을 보완한다. OOP 모듈성의 핵심 단위는 클래스인 반면, AOP는 모듈화 단위가 관점(Aspect)이다. @Transactional이 대표적인 예이다. 공통의 기능(트랜잭션)을 분리 및 모듈화하여 여러 코드(insertUser, selectMoney)에 쉽게 적용할 수 있게 해준다. 특정 계정의 ID와..
-
Spring
Spring Boot 1으로 Todo List를 만들어 보자
이번 게시글에서는 Todo List 만들기에 앞서 간단하게 세팅과 필수적인 기능들을 살펴보도록 하자. 대상은 Spring Project는 해봤으나 Boot는 접하지 못한 분들이다. Spring의 개념적인 부분보다는 동작하는 기능에 무게중심을 둘 예정이다. 개념에 좀 더 관심이 있다면, 토비의 스프링이나 공식 문서를 확인하도록 하자. ( Spring Project, Spring Boot ) 개발 환경은 Mac OS와 Intellij로 진행이 되지만 Window나 이클립스를..
-
Java
Java의 ScheduledExecutorService를 이용해서 스케줄러를 만들어보자
ScheduledExecutorService는 concurrent 패키지에 포함되어 있으며, '일정 시간 후' 또는 '주기적'으로 command(작업)를 실행시켜줄 수 있는 녀석이다. 스프링을 사용했다면 간편하게 @Scheduled를 사용했겠지만, 쌩 자바를 쓸 일이 있어서 ScheduledExecutorService를 사용해봤다. 코드 자체가 직관적이기 때문에 거두절미하고 코드를 보자. import java.time.Duration; import java.time.ZoneId; import java.time.ZonedDat..
-
Java
[Jackson] JsonInclude 속성에 대해 알아보자.
Json 형식으로 데이터를 주고받을 때 Jackson의 ObjectMapper를 자주 이용한다. 그런데 기본값으로 Serialize 하게 되면 null, "" 같은 (상황에 따라) 필요 없는 값 또한 모두 변환시켜준다. 이를 아래의 메소드를 통하여 Serialize할 때 원하는 값만을 포함시킬 수 있다. objectMapper.setSerializationInclusion(); 아래 주석처럼 어노테이션으로도 이용할 수 있다. 객체마다 Include 방식이 다르면 어노테이션을 활용하..
-
Java
Java로 날씨 알림 서비스를 만들어보자 (OOP, Clean Code)
개발동기 비 오는 날만 알림을 받고 싶다. 세상에 좋은 날씨 애플리케이션은 많다. 그러나 매일 날씨 애플리케이션을 확인하는 것은 번거롭고, 내가 딱 필요한 정보만을 제공해주는 서비스도 (아마) 없다. 그래서 날 위한 서비스를 내가 만들기로 했다. 왜? 난 개발자니깐 작년에 개발실력을 향상하기 위해 온갖 서적과 영상 등을 봤다. 점차 이러한 학습량은 많아졌고, 아는 듯한 느낌은 많이 들었다. 그러나 막상 해보니 겉만..
-
Java
Java의 List를 상황에 맞게 생성해보자 ( asList(), emptyList(), singletonList() )
우리는 평소에 개발을 하면서 자바의 List를 많이 쓴다. 이번 글에서는 List를 상황에 맞게, 좀 더 우아하게 사용하는 방법을 알아보도록 하겠다. 1. 기본적인 List 생성 List list = new ArrayList<>(); list.add("민수"); list.add("미선"); list.add("석훈"); ArrayList는 최초에 생성자를 통해 객체를 만들 때 스태틱에 있는 빈 Array를 할당하는 작업만 한다. private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENT..
-
Diary
생애 첫 기술세미나 (MSA)
스프링캠프 가기 전 Ahea에서 주최하는 세미나에 참석을 했다. 주니어급 개발자들이 스터디를 통해 나온 결과물들을 발표하였고, 나와 비슷한 나이대의 분들도 저렇게 열심히 한다는 것에 대해서 나는 강한 동기가 부여되었다. 그렇지만 아직은 때가 아니라고 판단하여 스터디원 모집을 외면했다. 그러나 Spring Camp가 더 큰 동기를 부여해주었고, 아직 부족한 점은 많지만 일단 지르고 보자는 생각으로 Ahea에 연락을 하였고..
-
Spring
[MSA] #6 Spring Cloud Netflix
[MSA] #1 Monolithic Architecture 란? [MSA] #2 Microservice Architecture 란? [MSA] #3 Circuit Breaker [MSA] #4 API Gateway [MSA] #5 Service Discovery [MSA] #6 Spring Cloud Netflix 스프링과 전 세계에서 MSA를 제일 잘하는 기업 중 하나인 Netflix에선 이미 MSA 구축을 편하게 하는 많은 기술과, 갖가지 이슈에 대한 해결책 또한 제공을 하고 있습니다. Spring Cloud Netflix는 자동 환경 설정과 Spring Environme..
-
Programming
[MSA] #5 Service Discovery
[MSA] #1 Monolithic Architecture 란? [MSA] #2 Microservice Architecture 란? [MSA] #3 Circuit Breaker [MSA] #4 API Gateway [MSA] #5 Service Discovery [MSA] #6 Spring Cloud Netflix MSA는 Cloud 환경과 밀접하게 관련이 있습니다. 각 서비스마다 다른 서버에 올려야 되는데, 물리 서버를 사용하게 되면 관리하기 힘들어집니다. 100개의 서버가 필요하다면 100개의 물리 서버의 비용과 장소 비용 하드웨어 관리 비용 등..
-
Programming
[MSA] #4 API Gateway
[MSA] #1 Monolithic Architecture 란? [MSA] #2 Microservice Architecture 란? [MSA] #3 Circuit Breaker [MSA] #4 API Gateway [MSA] #5 Service Discovery [MSA] #6 Spring Cloud Netflix MSA는 각각의 서비스를 API 형태로 제공한다는 것을 알게 되었습니다. 그러면서 몇 가지 이슈가 생겨나게 됩니다. 예를 들면 서비스마다 주소가 다르다는 점과 로깅, 모니터링, CORS처럼 서비스 간의 공통된 로직의 관리가 있습니다..
-
Programming
[MSA] #3 Circuit Breaker
[MSA] #1 Monolithic Architecture 란? [MSA] #2 Microservice Architecture 란? [MSA] #3 Circuit Breaker [MSA] #4 API Gateway [MSA] #5 Service Discovery [MSA] #6 Spring Cloud Netflix Circuit Breaker란? 에너지가 있는 도선과 중립 도선 사이의 전류 균형이 깨졌을 때, 전류를 차단하는 장치 학생 때 포기한 물리수업에서 나올 법한 말들이 나오네요. 한국어로는 누전 차단기입니다. (두꺼비집) 누전으로 인해 집이..
-
Programming
[MSA] #2 Microservice Architecture 란?
[MSA] #1 Monolithic Architecture 란? [MSA] #2 Microservice Architecture 란? [MSA] #3 Circuit Breaker [MSA] #4 API Gateway [MSA] #5 Service Discovery [MSA] #6 Spring Cloud Netflix 이전 글에서는 Monolithic Architecture에 대해서 알아봤습니다. Monolithic은 모든 것이 하나로 묶여있다고 말했었는데요, 이번에 소개할 MSA는 묶여있는 것을 나누는 것입니다. 마틴 파울러는 MSA를 다음과 같이 정의합니다. 마이크..
-
Programming
[MSA] #1 Monolithic Architecture 란?
[MSA] #1 Monolithic Architecture 란? [MSA] #2 Microservice Architecture 란? [MSA] #3 Circuit Breaker [MSA] #4 API Gateway [MSA] #5 Service Discovery [MSA] #6 Spring Cloud Netflix 요즘은 Microservice Architecture(이하 MSA)가 항상 화두에 올라있는 것 같습니다. 그래서 MSA가 도입된 배경과 갖가지 이슈를 어떻게 해결했는지에 대해 차근차근 써보려고 합니다. Monolithic이라는 단어를 들어보셨나요? 생소해서..
-
Java
Intellij로 자바 프로젝트 만들기 + 라이브러리 추가하기
Intellij로 스프링 부트 프로젝트를 만드는 글은 많은데, 일반 자바 프로젝트를 만드는 글은 많이 보이지 않아 작성합니다. 프로젝트는 Gradle의 도움을 받아 만들어 보겠습니다. 그러나 Gradle을 모르셔도 전혀 겁먹으실 필요가 없으시며 프로젝트 생성과 함께 필요한 라이브러리를 추가해보겠습니다. 1. 프로젝트 생성 [File] - [New] - [Project]를 클릭합니다. 2. 프로젝트 종류 선택 좌측에서 Gradle, 중앙에서 Java를 선..
-
Book
프로그래머, 열정을 말하다
본 책은 더 나은 코드를 작성하기 위한, 더 나은 소프트웨어를 설계하기 위한 지침을 제시하진 않습니다. 그러나 더 나은 소프트웨어 엔지니어가 되는 지침을 제시합니다. 그러면 여러분은 더 나은 엔지니어가 되기 위해서는 어떤 모습을 가져야 한다고 생각하시나요? 컴퓨터 과학이나 본인이 사용하는 기술에 대한 깊숙한 이해를 가진 모습이라는 데는 다 동의를 할 것입니다. 그러면 이외에는 어떤 것이 있을까요? 본 책은 이..
-
Diary
고졸 비전공 개발자의 2년간 회고
안녕하세요. 소프트웨어 엔지니어 김민수입니다. 지난 개발 인생 2년이 참 다사다난했었는데요, 이번 기회에 지난날을 돌이켜보는 것도 좋은 기회일 것 같아 작성합니다. ~ 2016.01 (방황, 그리고 시작) 2015년 23살에 제대를 하고 백화점, 카페 등의 알바를 하며 오랜 시간 동안 뭘 하고 싶은 지를 고민을 많이 했었습니다. 그러다 국가에서 지원해주는 컴퓨터 프로그래밍에 관심을 갖고, 호기심 반 의심 반으로 면접 신청..
-
Programming
함수형 프로그래밍(FP)
자바 8을 사용하다 보니 자연스럽게 람다와 스트림을 통하여 함수형 프로그래밍을 접하게 되었습니다. 위 두 가지를 쓰면서도 함수형 프로그래밍에 대한 이해는 없는 채, 단순히 간결한 코드 작성이 가능하다는 이유만으로 사용을 해왔습니다. 그러다 함수형 프로그래밍을 좀 더 깊숙하게 알기 위해 스터디를 진행했습니다. 함수형 프로그래밍이 무엇이냐고 물어본다면 한마디로 '순수 함수(Pure Function)를 작성'하는 것이..
-
Seminar
Java and Spring forward! [KSUG]
KSUG(Korea Spring User Group)에서 주최하는 Java and Spring forward!에 다녀왔습니다. 최근 Java9과 Spring5가 릴리즈 되었고, 많은 내용이 변했기 때문에 관심을 가지다 해당 세미나에 참석하였습니다. 총 200석임에도 불구하고 8분 만에 매진된 걸 보니 저와 같은 생각을 하는 사람이 많았던 것 같습니다. 4가지의 세션이 있었고, 개인적으로는 첫번째와 마지막 세션에 큰 관심을 두고 있었습니다. 변경되거나 새로생..
-
JavaScript
Angular의 Component-Based Development
지난 8월 Ahea 팀 해커톤에 참석을 했었습니다. 그때 새로운 기술을 써보자는 의미로 Angular를 하게 되었고, 자연스럽게 Component-Based Development에 대한 이해를 하게 되었습니다. 오늘은 그 주제에 대해서 이야기를 나눠보려고 합니다. 아래는 저희 프로젝트 화면입니다. 보시는 바와 같이 로직은 Field Name과 Type을 필요한 만큼 동적으로 생성하여 값을 넣고, 원하는 추출 타입과 수를 정한 뒤 Preview를 클릭하면 서버..
-
Spring
스프링 빈은 Thread-safe 할까?
초기에 스프링을 공부할 때 스프링 빈의 기본 Scope는 싱글톤이고, 스프링 환경은 멀티 쓰레드이라는 것을 알았습니다. 그런데 '왜 하나의 공유자원(싱글톤 객체)을 여러 쓰레드에서 다루는데 문제가 되지 않을까?'란 생각을 했습니다. 한편으로는 '스프링이 마법을 부려서 쓰레드에 안전한 건가?'란 생각도 했고요. 차근차근 싱글톤과 불/가변 객체에 대해 알아보고 무엇이 착각을 일으켰는지 알아보겠습니다. 먼저, 위..
-
Spring
Spring 5.0.0 레퍼런스 (The IoC container) [작업중]
Spring 5.0.0 M3 일 때 부터 조금씩 번역한 내용이고, 개인적으로 크게 신경안 써도 될 부분은 생략시켰습니다. 스프링의 이해 및 영어공부를 위해서 작성했었고, 소수의 필요한 분들을 위해 공유합니다. https://docs.spring.io/spring/docs/5.0.0.RELEASE/spring-framework-reference/core.html#spring-core 1. IoC 컨테이너 1.1 스프링 IoC 컨테이너와 빈 소개 BeanFactory 인터페이스는 모든 유형의 객체를 관리할 수 있..
-
Spring
Spring boot환경에서 JWT 사용하기
근래 모바일 트렌드 중 하나는 로그아웃을 하지 않는 이상 로그인을 유지하는 것입니다. 일반적으로는 손쉽게 Session을 이용해서 클라이언트와 서버 통신 중 Stateless의 단점을 보완할 수 있었지만, 모바일의 특성상 자주 끊길 소지가 있습니다. 세션과 비슷한 역할을 하되, 계속해서 유지될 수 있는 기술을 찾다 보니 Token을 이용한 방식이 있었고, 그중 JWT를 사용하게 되었습니다. JSON Web Token (JWT)은 JSON 객체로서..