안녕하세요 프로젝트르 진행하면서 JPA의 강력한 기능인 중 하나인 1차 캐시가 언제 동작하는 지 잘 모르는 고 사용하시는 분들이 존재해서 한번 작성하게 되었습니다. 1차 캐시이 무엇인지에 대한 설명은 많은 분들이 잘 작성하셨기 때문에 간단하게 설명하고 "언제 동작하는가?" 에대해서 설명을 하고자합니다. 1차 캐시란? JPA하면 1차 캐시를 빼놓을 수가 없는데요 성능적으로 많은 이점을 가지고 갈 수 있는 강력한 기능이라고 생각합니다. 1차캐시는 영속성 컨텍스트에 Entity를 보관을 하는데 보관시 @Id를 기반으로 보관을 합니다. 때문에 JPA는 우선 1차캐시를 확인하여 해당 Entity가 있는지 여부를 확인 하고 있다면 캐시에서 가져다 사용을 하고 없다면 DB에 쿼리를 날려 해당 데이터를 가지..
프로젝트를 진행하면서 이용권 기능이 필요했습니다. 때문에 이용권에 맞게 난수 생성이 필요했고 안전한 난수를 어떻게 생성 할 수 있을까? 찾던 중에 SecureRandom 을 발견했습니다. 많이 들 사용하는 단순 Random의 경우 현재 시간을 시드로 사용하기 때문에 완벽한 무작위가 아닌 '의사난수' 가 생성 되기 때문에 목적에 부합하지 않았습니다. 그렇게 검색 도중 의사 난수가 아닌 확실하고 안전한 난수 생성을 도와주는 SecureRandom을 발견 하게 되었습니다. 이러한 SecureRandom 을 사용하면서 발생했던 이슈를 공유 해보려고 합니다. SecureRadom는 어떻게 난수를 생성 할까? 시스템 시간을 시드로 해서 난수(?)를 생성하는 Random과 달리 OS에서 임의 데이터를 가..
log-back을 이용하여 에러로그를 추적하는 경우 해당 메시지들은 로그 추적을 위해 만든 소유자 계정으로 메시지가 전송되는 것을 확인 할 수 있습니다. 이때 개인 계정이 아닌 bot을 이용하는 방법을 공유 하고자 작성하게 되었습니다. 우선 기본적으로 bot을 만들 수 있는 권한은 System Admin이어야 가능합니다 하단에 보시면 Bot Acccounts 가 보이는데요 member 권한인 경우에는 안 보 일 수 있습니다 [ Bot Acccounts ] 를 클릭 해보시면 생성 하는 곳이 없습니다… 이경우 SystemConsole로 가서 Bot설정을 해줘야 하는데 아래와 같이 설쟁 하주시면 됩니다. Enable Bot Account Crea..
안녕하세요 오늘은 git에서 pull을 하면 merge hitsory는 어떻게 되는지 알아보려고 합니다. 일반적으로 프로젝트를 진행하면서 git에서 가장 많이 사용 하는게 pull 아닐까 싶은데요. 주기적으로 pull을 하면서 충돌의 위험성을 감소 할 수 있는 강력한 기능입니다. 여기서 git pull에 대해서 모르시는 분들이 있으 실 수 있으니 간단히 설명자면 fetch + merge 라고 생각하시면 됩니다. PULL = Fetch + Merge 즉, Fetch를 통해 원격 저장소에서 최신 커밋 이력을 가지고오고 Merge를 통해 현재 브랜치에 병합을 해준다. 라고 볼 수 있습니다. 그러면 여기서 생각이 드는 것은 Merge 이력은 무조건 만들어 지겠지? 라는 것입니다. 물론 옵션에 따라 다르겠지만 대..
import java.util.*; class Solution { public String[] solution(String[] strings, int n) { Comparator stringComparator = Comparator.comparing(a -> a.charAt(n)); return Arrays.stream(strings) .sorted(stringComparator.thenComparing(Comparator.naturalOrder())) .toArray(String[]::new); } } https://school.programmers.co.kr/learn/courses/30/lessons/12915
프로젝트를 진행하면서 수많은 개발서버와 수많은 브랜치가 생성이 되는데요. 저같은 경우 개발서버에 맞는 브랜치를 만들고 해당 브랜치를 Jenkins를 통해 빌드 배포하는 방식으로 많이 이루어 졌습니다. 하지만 개발서버가 많아 질 수 록 Merge하고 젠킨스를 통해 수동 배포하는 상황이 많아지면서 불필요한 동작과 시간이 소비가 많아졌습니다. 간략한 구조는 아래와 같은 구조가 될 거 같습니다. 하지만 대부분 별다른 설정없이 사용을 하면 젠킨스 Branch별 Job을 생성해서 Webhook설정하는 구조로 아래와 이미지 같이 많이 사용 하 실 겁니다. 물론 브랜치가 몇개 안되면 상관 없겠지만 점차 Branch의 숫자가 늘어나면 해당 Job의 개수도 많이 늘어나야 할 것입니다. Job 하나로 구성하고 Merger ..
프로젝트를 진행하면서 Batch를 구성해야하는 경우가 많은데요. 대부분 Job을 구성 할때 DB를 조회하는 JdbcItemReader, Jdbccursoritemreader, Jdbcpagingitemreader등을 이용해서 만드는 경우가 많았습니다. 간혹 저의 경우 외부 Data를 받기 위해 API를 호출하고 받은 Response Data를 저희 DB에 넣어서 동기화하는 Job을 구성해야 하는 경우가 있었는데요. 대부분은 DB에서 read해서 Db에 write를 하는 글은 많이 보이지만 외부 연동이 들어가는 Job은 어떻게 구성을 해야하는지 잘 보이지 않아 공부 할 겸 글로 작성해보려고 합니다. 틀린 부분 이 있을 수 있으니 감안해주시면 감사하겠습니다. 요구조건 외부 Rest API를 통해 데이터를 받..
SELECT UGB.TITLE, UGB.BOARD_ID, UGR.REPLY_ID, UGR.WRITER_ID, UGR.CONTENTS, DATE_FORMAT(UGR.CREATED_DATE, '%Y-%m-%d') as CREATED_DATE FROM USED_GOODS_BOARD UGB INNER JOIN USED_GOODS_REPLY UGR ON UGB.BOARD_ID = UGR.BOARD_ID WHERE DATE_FORMAT(UGB.CREATED_DATE ,'%Y-%m') = '2022-10' ORDER BY UGR.CREATED_DATE ASC , TITLE ASC https://school.programmers.co.kr/learn/courses/30/lessons/164673 프로그래머스 코드 중심..