전체 글

개발자가 되어가는 기록 Github : https://github.com/JoHyoju04
· Backend
문제엘라스틱 서치로 API 응답 최대소요시간 그래프를 통해 /api/v1/user-challenges인 URL path에서 높은 duration을 발견했다.원인 파악 과정SQL 쿼리 분석 : N+1 문제 발견연관관계 분석 :       2-1. UserChallenge 와 Challenge 는 N:1 단방향 연관관계       2-2. Challenge와 ChallengeRecord는 1:1 양방향 연관관계    2-3. UserChallenge를 조회하면서 연관관계인 Challenge를 조회한다. 그리고 Challenge와 연관관계인 ChallengeRecord를 조회함 3. 일대일 단방향 관계에서 N+1 문제 원인 분석 (Challenge와 ChallengeRecord)     3-1. Challen..
· Backend
Jmeter란? 아파치에서 제공하는 어플리케이션으로, java로 이루어진 오픈소스의 성능테스트 도구 다른 테스트 도구들 보다 좀 더 웹서버 성능테스트에 특화 되어져 있다. 테스트케이스를 스크립트화하는 기능이 따로 있진 않지만, 레코딩 기능을 지원해주고, ui기능을 통해 다양한 부하테스트를 시도하는 것이 가능 Jmeter의 장점 복잡하고 디테일한 부하테스트가 가능하고, 다양한 프로토콜을 혼용해서 사용이 가능하다 기능적으로 스크립트 레코딩(script recording)이 가능하다 UI를 통한 테스트 프로그램의 작성이 가능하기 때문에, locust보다 언어의 요구사항이 낮다(하지만 사용성은 다양한 기능을 제공해 주는 만큼 더 어렵다) 환경 mac m1 Java 11 설치 1. 자바 설치 후(자바 8 이후여야..
· Backend/Java
String의 null과 빈 값(””)처리 null이나 빈 값이 들어올때 어떻게 처리해야하는지 고민했다. String의 값이 어떤 값이 들어올때 처리를 안해주는지 정의해준다. null 빈 값(””) white space //1. String name=null; //널 System.out.println(name==null); //true //2. String name2=""; //빈 값 String name3=" "; //공백 System.out.println(name2.isEmpty()); //true System.out.println(name2.equals("")); //true System.out.println(name3.isEmpty()); //false System.out.println(name3..
상황 update쿼리를 날리는 함수인 updateState에서 TransactionRequiredException :Executing an update/delete query 에러가 발생 @Override public Long updateState( LocalDate date, UserChallengeStateType beforeState, UserChallengeStateType afterState ) { final Predicate[] predicates = new Predicate[]{ qUserChallenge.state.eq(beforeState), qUserChallenge.startDate.eq(date) }; long resultCount = update(qUserChallenge) .se..
들어가기 전에) Transactional의 @Transactional의 readonly 옵션을 true로 사용하면 성능이 좋다고 한다. 왜일까? “읽기 전용 쿼리의 성능 최적화”로 엔티티가 영속성 컨텍스트에 관리되면 1차 캐시부터 변경 감지까지 얻을 수 있는 혜택이 많다 하지만 영속성 컨텍스트는 변경 감지를 위해서 스냅샷 인스턴스를 보관하므로 더 많은 메모리를 사용하는 단점이 있다. 만약 조회만 하는 경우에는 읽기전용(@Transactional(readonly=true))를 사용하여 엔티티를 조회하면 메모리 사용량을 최적화할 수 있다. 결론: 조회를 하는 경우에는 @Transactional(readonly=true)을 사용하자! 영속성 컨텍스트에서 변경감지와 스냅샷 저장을 하지 않기 때문에 성능을 최적화..
Lombok이란? 프로젝트가 객체 중심으로 개발하던 데이터 중심으로 개발하던 개발자들은 VO/DTO/Domain 객체를 생성해 getter/setter 그리고 toString 메서드를 만듭니다. 처음에 개발 초기에는 깔끔하게 하지만 잦은 수정과 필드명 변경 추가에 따라 관리가 쉽지 않습니다. 그래서 롬복(Lombok)은 자바 클래스를 만들때 자주 사용되는 getter/setter나 toString 등의 코드를 애너테이션으로 대체해서 선언하고 java 코드를 컴파일 할 때 그에 맞는 코드를 생성해주는 것이다. Lombok 의존성 추가 (build.gradle) implementation 'org.projectlombok:lombok' 하지만 의존성을 추가해주고도 에러가 생겼다. 상황 : @Getter을 선..
· Backend
상황: 스프링 버전 3.0.1로 프로젝트를 빌드할 때 다음과 같은 에러가 났다. No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.0.1 was found. 원인 : jcenter 인증서 만료때문이였다. 해결 : build.gradle에서 스프링 버전을 2.7.7로 변경한 후 다시 빌드했다.
· CS 공부
들어가기 전에  ) 트랜잭션이란?데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위 트랜잭션의 특징 ACID Atomicity(원자성) 트랜잭션을 구성하는 연산 전체가 모두 정상적으로 실행되거나 모두 취소되어야 한다. Consistency(일관성)트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지한다.Isolation(고립성,격리성)두 개 이상의 트랜잭션이 동시에 발생할 때, 서로의 연산에 영향을 주면 안된다.Durability(영구성)커밋된 트랜잭션의 내용은 영구히 반영된다.격리성 이슈격리성을 보장한다면 순차적으로 트랜잭션이 실행되기 때문에 동시성 문제(응답지연)가 발생합니다.그렇다고 병렬적으로 트랜잭션이 실행되면 데이터 무결성이 깨질 수 있습니다.1. 격리성과 동..
노드가 17개이기 때문에 완전 탐색을 한다. 비트마스킹을 이용해서 방문한 노드들을 표현했다. https://programmers.co.kr/learn/courses/30/lessons/92343?language=cpp 코딩테스트 연습 - 양과 늑대 [0,0,1,1,1,0,1,0,1,0,1,1] [[0,1],[1,2],[1,4],[0,8],[8,7],[9,10],[9,11],[4,3],[6,5],[4,6],[8,9]] 5 [0,1,0,1,1,0,1,0,0,1,0] [[0,1],[0,2],[1,3],[1,4],[2,5],[2,6],[3,7],[4,8],[6,9],[9,10]] 5 programmers.co.kr 참고 : https://blog.encrypted.gg/1029 https://wadekang.t..
pull을 진행할때 이런 오류가 난다면 git pull --rebase 또는 git pull origin --rebase 로 해결한다.
호_두씨
Hodu's workspace