본문 바로가기

전체 글143

@NotNull, @NotEmpty, @NotBlank 차이 엔티티의 필드 값을 정하다 Not Null 설정을 정하려다 @NotNull과 @NotBlank @NotEmpty라는 세 어노테이션이 있는 것을 알게 되었습니다. 세 어노테이션 모두 Bean Validation (Hibernate Validation) 에서 제공하는 표준 Validation 입니다. NotNull은 javax.validation.constraints.NotNull 으로 validation 패키지 안에 있는 어노테이션으로 기본적으로 Null 값을 허용하지 않으나 “”과 “ “으로 빈 칸과 공백을 허용합니다. NotEmpty는 null과 “”는 허용하지 않습니다. 그러나 “ “은 허용하게 됩니다. 공백 값 또한 정상 처리 되도록 하고 싶을때 사용하면 될 거 같습니다. NotBlank는 null.. 2022. 2. 19.
자바 Optional이란 Optional 이란 NullPointerException을 피하기 위해 만들어진 클래스입니다. UserVO userVO = getUser(); if (userVO != null) { Address address = user.getAddress(); if (address != null) { String postCode = address.getPostCode(); if (postCode != null) { return postCode; } } } return "우편번호 없음"; 이렇게 Optional 사용하지 않으면 null 체크를 반드시 해야해서 번거로움이 많습니다. Optional userVO = Optional.ofNullable(getUser()); Optional address = userVO.m.. 2022. 2. 19.
git ignore 적용 안될때 해결 방법 원인 .gitignore 파일 전에 stage 파일이 캐쉬 처리되어 기록이 남아 있어 파일이 계속해서 보입니다 해결 방법 git rm -r --cached . git add . git commit - m "clear git cache" 2022. 2. 19.
좋은 커뮤니케이션 방법 개요 좋은 소통 방법에 대한 고민을 지속적으로 하며 성장하고 싶어 공부 기록을 남기려고 합니다. 주저리 주저리 협업을 하며 느끼는 것이지만 항상 가독성이 좋은 코드를 지향해야 한다는 것입니다. 다른 분이 쓴 코드를 볼때마다 느끼는 점입니다,, 또한 이해하기 쉬운 언어로 대화해야 합니다. 일상 생활에도 적용되는 말이기도 합니다만 항상 상대방의 입장을 고려해 의사 소통을 진행해야 함을 많이 느꼈습니다. 무엇보다 대화를 자주 나눠야 한다는 점입니다. 잠깐 틈이 나도 각자의 방향은 달라지기 마련입니다. 프로젝트 안에서 같은 방향을 보고 직진하기 위해선 팀원 모두가 대화를 많이 주고 받으며 올바른 방향으로 나아가고 있는가에 대한 고민을 끊임없이 해야 합니다. 성공적인 팀의 구성 요소 1. 공동의 목적 2. 일반적.. 2022. 2. 19.
좋은 커밋 메시지 작성법 예전에 읽었던 글이었지만 주로 사용하는 커밋 메시지 이외엔 잘 적용하진 않는 것 같아 정리를 해두려고 합니다. 좋은 커밋의 목적은? 더 좋은 커밋 로그 가독성. 더 나은 협업과 리뷰 프로세스. 더 쉬운 코드 유지보수. 좋은 커밋을 위한 8가지 약속. 제목과 본문을 한 줄 띄워 분리하기 제목은 영문 기준 50자 이내로 작성 제목 첫글자를 대문자로 작성 제목 끝에 . 금지 제목은 명령조로 Github - 제목(이나 본문)에 이슈 번호 붙이기 본문은 영문 기준 72자마다 줄 바꾸기 본문은 어떻게보다 무엇을, 왜에 맞춰 작성하기 커밋 템플릿 만드는 방법 $ touch ~/.gitmessage.txt $ vi ~/.gitmessage.txt 입력 후 저장합니다. # --- 제목(title) - 50자 이내로 --.. 2022. 2. 19.
스프링 커버링 인덱스로 페이징 성능 개선하기 지난 글 2022.02.07 - [스프링 부트/A-ger] - 스프링 무한스크롤 페이징 검색 처리 및 동적쿼리 적용하기 지난 글에서 무한 스크롤 적용을 위해 slice와 booleanExpression으로 동적 쿼리를 적용했었습니다. 검색 기능은 아무래도 이용자들이 가장 많이 이용할 기능이기에 더 많은 성능 개선을 위해 커버링 인덱스를 적용하기로 했습니다. 일단적으로 조회 쿼리에서 성능 저하의 원인이 되는 것은 인덱스 검색 후 컬럼 값을 읽을 때입니다. select 부분에서 데이터 블록에 접근하기 때문에 많은 성능 저하를 유발합니다. 그러나 커버링 인덱싱을 적용하게 되면 where, order by, offset, limit를 인덱싱으로 빠르게 Id만 찾아내 데이터 블록에 접근하기에 성능 향상에 도움이 .. 2022. 2. 18.
스프링 부분 수정 쿼리 @DynamicUpdate 개요 프로젝트를 진행하던 중에 수정 쿼리를 날려야 할 상황이 거의 모든 엔티티에 있었습니다. JPA의 기본 설정은 모든 컬럼을 업데이트하게 되어 있습니다. 대부분의 경우 엔티티마다 전부 수정하는 쿼리를 날리는 경우는 없습니다. 따라서 부분 수정쿼리를 날리는 어노테이션을 찾던중 @DynamicUpdate 을 발견하였습니다. 사용법 사용법은 간단합니다. 엔티티 클래스에 @DynamicUpdate만 붙여주면 변경된 컬럼만 찾아 업데이트를 해줍니다. 자주 사용되는 상태변경이나 조회 수 같은 경우에 사용하면 좋을거 같습니다. @Entity @DynamicUpdate public class Product { ... } 2022. 2. 18.
카프카 명령어 정리 Docker에서 실행법 docker-compose -f docker-compose.yml up -d 카프카 쉘 진입법(kafka는 docker에 올라간 컨테이너 이름) docker exec -it kafka /bin/sh cd /opt/kafka_2.13-2.8.1/bin 으로 진입 ls로 확인하면 여러 파일이 있어 여기서 토픽 관련 명령어 수행 가능합니다. 카프카 토픽 생성 kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic {topic_name} repication-factor는 브로커 1개이며 partition 1개로 생성하는 명령어입니다. 권장 브로커는 3개입니다. 카프카 토.. 2022. 2. 12.
스프링 레디스 최근 검색어 관리하기 거래 플랫폼 프로젝트를 진행하던중 검색 창에 최근 검색어 기능 추가를 했으면 좋겠다는 의견이 있었습니다. 2가지 방법을 생각했는데 첫번째는 search 엔티티를 만들어 관리하는 방식이었습니다. 두번째는 레디스에서 최근 검색어를 위해 리스트 자료구조를 이용해서 관리하는 방식을 생각했습니다. 첫 번째 방식은 인메모리 캐시 방식인 레디스에 비해 속도가 느릴거 같고 관리 측면에서도 원하는 사이즈가 꽉 찾을때 시간순으로 정렬한 후에 가장 오래된 컬럼을 삭제하고 다시 insert를 해야한다는 점이 번거로웠습니다. 그래서 엔티티를 아예 만들지않고 accountId로 식별할 수 있는 레디스 리스트를 만들어서 관리하는 방식을 택했습니다. 로직은 사용자가 검색을 하게되면 accesstoken으로 사용자를 조회하고, 키 값.. 2022. 2. 10.
스프링에서 카프카 시작하기 진행중인 프로젝트에 적용하기 전에 간단하게 카프카로 보내는 프로젝트를 만들어 보겠습니다. 1. 프로젝트 생성 start.spring.io에서 gradle, spring boot 2.5.9 버전 dependency에 spring web과 kafka, lombok, websocket을 추가해주세요. 2. 설정 값 생성 클래스 생성하셔서 아래 값을 기입해주세요. 토픽과 그룹 아이디, 주소를 주입해줄거에요. public class KafkaConstants { public static final String KAFKA_TOPIC = "kafka"; public static final String GROUP_ID = "test"; public static final String KAFKA_BROKER = "loc.. 2022. 2. 9.
맥북으로 도커에 카프카 설치하기 실행 버전 맥북 m1 도커 v20.10.12 카프카 버전 2.13-2.8.1 :: 2022/2/9일 기준 latest로 받았습니다. 터미널을 실행하시고 이미지를 다운 받아주세요. git clone https://github.com/wurstmeister/kafka-docker ls 명령어로 확인해보시면 kafka-docker 폴더가 생성된 것을 확인하실 수 있습니다. cd kafka-docker 들어가시면 docker-compose.yml 파일이 있습니다. vi ~/docker-compose.yml 파일로 파일을 수정해줍니다. 아래 코드와 같이 수정해주었습니다. version: '2' services: zookeeper: image: wurstmeister/zookeeper container_name: .. 2022. 2. 9.
아파치 카프카란? 아파치 카프카란 대용량, 대규모 메시지 데이터 처리하기 위한 분산 메시징 플랫폼입니다. 카프카를 쓰는 이유? 서버가 늘어나면서 타겟이 한 곳이 아니라 여러 곳으로 분산해서 데이터를 보내게 됩니다. 실시간 트랜잭션 처리와 비동기 처리가 이뤄져야 하지만 관리하는 플랫폼이 없어 파이프라인 관리가 어려워집니다. 카프카는 송신자와 수신자 사이에 위치에 적절하게 메시지를 분리해줍니다. 송신자(Publisher): 카프카에 데이터를 전송만 담당한다. 누가 받는지는 신경 쓰지 않습니다. 수신자(Subscriber): 수신자는 카프카에 원하는 토픽을 구독하고 데이터를 받습니다. 누구에게 보낼지 신경 쓰지 않아도 되며 수신자는 원하는 토픽의 메시지만 가져올 수 있습니다. 유지보수, 트래픽, 에러 처리 등에 대해 유리해집니.. 2022. 2. 8.