분류 전체보기
-
(Java)primitive, reference 타입Java & Kotlin 2021. 8. 26. 18:28
1) 서론 primitive, reference 타입은 개발을 공부했거나 컴퓨터공학과 수업을 들었다면, 당연히 알 수 있습니다. 하지만 막상 면접 때 질문을 받으니 머릿속에서 정리가 안 되는 경험을 했습니다. "긴장을 했기 때문"이라는 좋은 핑계가 있지만, 아무리 긴장을 해도 그 순간 바로 대답하지 못했다는 것은 제대로 알지 못했기 때문이라고 생각합니다. 그래서 이번 기회에 제대로 한번 정리해보려고 합니다. 2) primitive type 먼저 늘 그렇듯 영어의 의미를 알아야 합니다. primitive는 "초기의, 원시의"라는 의미입니다. 자바 언어에서는 primitive는 사전에 정의된 예약 키워드입니다. 즉 그 말은 변수명, 메서드명 등으로 사용할 수 없습니다. 자바에서는 아래와 같이 8개의 prim..
-
JPA N+1 문제를 해결해보자Spring Framework 2021. 8. 20. 17:41
1) N+1 문제란? ORM은 객체의 관계를 연결하는데요. 이를 활용하는 JPA는 엔티티 기준으로 쿼리를 사용하고, 엔티티에 연관된 모든 객체를 조회합니다. 모든 연관된 객체를 조회 하기에 문제가 발생합니다. N개의 결과를 얻기 위해 DB를 조회했는데, 추가적으로 쿼리가 발생하는 것입니다. 즉 얻고자 하는 결과에서 1개가 더 붙어서 조회가 되는 현상입니다. 마트에서 하는 1+1 행사라고 생각하시면 됩니다. "파를 샀더니, 마늘을 주네? 근데 난 마늘 안 먹는데... 이걸 굳이 왜..?" 얻고자 하는 결과 외에 추가로 결과를 얻는다는 것은, 추가 쿼리가 발생합니다. 그만큼 성능적으로 손해 볼 수밖에 없습니다. 2) 전체 구조 // 애노테이션들 생략 했습니다. public class Post { privat..
-
Kafka, @Async 비동기 처리 맛보기Kafka 2021. 8. 16. 16:50
서론 이 글의 계기는 이렇습니다. 특정 게시글을 조회하고, 조회 수를 올려준다. 하지만 해당 게시글에 트래픽이 몰리고, 조회 수를 처리하는데 자원을 낭비해야 할까? 일단 글부터 보여주고, 조회 수는 천천히 반영해도 되지 않을까? 그래서 게시글을 조회 후 빠르게 사용자에게 보여주고, 조회 수는 Kafka, @Async를 사용해서 다른 서버에서 비동기로 처리하는 것이 더 좋지 않을까 생각했습니다. Hello World 수준의 예제입니다. 오류가 있다면 언제든지 댓글 남겨주세요! Kafka Kafka는 크게 producer, consumer, topic으로 이루어진 데이터 스트리밍 플랫폼입니다. (앞으로 producer: 생산자, consumer: 소비자로 부르겠습니다.) 생산자가 메시지를 만들어내고, 소비자..
-
[JPA, Redis]페이지별 결과 캐싱Spring Framework 2021. 8. 11. 17:45
1. 서론 Spring Data Redis와 JPA의 페이징을 이용해서 해당 결과를 캐싱하겠습니다. 2. JPA 페이징 2. 1. query 작성 @Query("from Post") Optional findAllPosts(Pageable pageable); 모든 게시물 목록을 조회합니다 Pageable 인터페이스를 파라미터로 받습니다 2. 2. Test @Test public void findPosts() { Pageable pageRequest = PageRequest.of(0, 10); List posts = postRepository.findAllPosts(pageRequest).orElseThrow(RuntimeException::new); posts.forEach(p -> System.out.p..
-
[Lombok]@Builder과 생성자 애노테이션Java & Kotlin 2021. 8. 8. 16:16
서론 Lombok에서는 @Builder, @AllArgsConstructor, @NoArgsConstructor, @RequiredArgsConstructor와 같이 빌더와 생성자를 쉽게 만들어 주는 애노테이션들이 있습니다. 하지만 무작정 사용하게 되면 명확하지 않고, 에러를 발생시킬 수도 있습니다. 그래서 이 글에서는 해당 애노테이션들의 역할과 차이점에 대해서 작성하고, 발생할 수 있는 에러에 대해서 정리하려고 합니다. 생성자 애노테이션 1. @NoArgsConstructor 파라미터가 없는 기본 생성자 final 필드 포함 X 자바에서는 파라미터가 존재하는 생성자를 만들 경우 반드시 파라미터가 없는 기본 생성자를 작성해야 합니다. 이때 @NoArgsConstructor를 사용하여 편리하게 생성자를 작..
-
Nginx 무중단 배포 따라하고, 에러 해결 하기Linux 2021. 8. 1. 23:02
서론 이 글은 스프링부트 + AWS로 유명한 이동욱 개발자님의 글을 바탕으로 작성합니다. 전체적인 흐름은 해당 블로그를 보시면 됩니다. https://jojoldu.tistory.com/267 그렇다면 이 글은 왜 작성할까요? 이동욱 개발자님의 글은 아주 완벽하지만, 정작 제가 사용하는 환경과 달랐습니다. 아마도 해당글을 작성한 시기, 버전, OS가 달랐기 때문에 중간중간 에러가 발생했습니다. 그래서 해당 블로그의 글 중에서 저와 맞지 않던 설정 부분과 어떻게 해결했는지 작성합니다. 아래의 스펙을 따릅니다. 오라클 클라우드 Ubuntu 20.04 Nginx 1.18.0 Nginx 설치 이동욱 개발자님 블로그에서는 yum을 사용했지만, 저는 ubuntu의 기본 패키지 설치 명령어인 apt를 사용하도록 하겠..
-
클라우드가 제공하는 1GB램, 알차게 써보기Linux 2021. 7. 27. 17:07
서론 AWS, Oracle Cloud 등은 가상 서버를 사용자에게 제공을 합니다. 이러한 가상 서버를 이용해서 사용자는 추가적인 인프라 없이 애플리케이션을 배포할 수 있습니다. 대부분의 클라우드는 무료 계정을 제공합니다. 하지만 그만큼 성능이 떨어집니다. 왜냐하면 고작 1GB 램을 제공하기 때문인데요. 요즘 스마트폰에도 램이 최소 8GB가 들어가는 것을 고려한다면, 굉장히 작은 수치입니다. 테스트용 간단한 애플리케이션을 배포하더라도 기본적으로 Mysql, Redis, Docker 등이 돌아가게 된다면, 굉장히 느린 속도와 자주 멈춤 현상을 보입니다. 어차피 무료계정에 제공되는 램이 정해져 있다면, 이를 최대한 활용해서 성능 개선해보겠습니다. Swap 제가 선택한 방법은 swap 입니다. 램에 올라와있는,..
-
SpringBoot 테스트 중 Bean을 찾을 수 없을 때Spring Framework 2021. 7. 25. 00:47
에러 내용 스프링부트 테스트 도중 Repository 객체를 @Autowired로 빈 주입을 시도했습니다. 하지만 계속해서 테스트 실패와 함께, 빈을 찾을 수 없다는 에러가 발생했습니다. 그리고 결과적으로 Repository 부분에서 NPE가 발생합니다. 시도 1. @Repository 유무 스프링부트에서 @Component로 편리하게 빈 주입을 할 수 있습니다. @SpringBootAplication이 자동으로 이들을 스캔 후 모든 빈들이 생겨나기 전에 가장 먼저 빈으로 등록해 줍니다. 그리고 @Repository, @Service, @Controller는 좀 더 명확한 layer 구분을 위해서 @Component를 상속받고 있습니다. 하지만 @Repository는 잘 달려있습니다.. 문제가 뭘까요? ..