Jihye Byun

@wisdom88

Joined on Jun 14, 2021

  • function 분리 이유 GET_HR_TOTAL_ANNUAL_USED_COUNT GET_HR_TOTAL_ANNUAL_REQ_COUNT 위 두 개의 펑션 때문에 속도가 느리다. 펑션을 해당 쿼리에서 제거하고 서비스 레이어에서 조합하고 병렬 처리를 한다. function이 사용된 쿼리 SELECT @rownum:=@rownum+1 AS RNUM , (PAGE_COUNT - PAGE_OFFSET + 1 - @rownum) AS NUM_ASC , (PAGE_OFFSET + @rownum) AS NUM_DESC
     Like  Bookmark
  • 1. 스프링 AOP와 @Transactional 스프링 AOP(Aspect-Oriented Programming)는 관점 지향 프로그래밍을 통해 부가적인 로직(로깅, 트랜잭션 관리, 보안 등)을 비즈니스 로직과 분리하여 재사용성을 높이고 코드 중복을 줄인다. @Transactional은 AOP를 기반으로 하여 선언적 트랜잭션 관리를 제공한다. @Transactional은 메서드나 클래스 레벨에서 선언되고, 런타임 시 스프링이 트랜잭션 경계를 관리한다. 내부적으로 스프링은 프록시 패턴을 사용해 트랜잭션 관련 부가기능을 실행한다 2. 프록시 패턴과 동작 원리 2.1 프록시의 생성 스프링 컨테이너는 @Transactional이 선언된 클래스나 메서드를 감싸는 프록시 객체를 생성한다. 이 프록시는 실제 객체 대신 클라이언트에 반환되며, 메서드 호출을 가로채 트랜잭션 관련 로직을 처리한다.JDK 동적 프록시: 인터페이스가 있는 경우 사용 CGLIB 프록시: 클래스 기반 프록시로, 인터페이스가 없는 경우 사용 2.2 프록시 동작 과정
     Like  Bookmark
  • 왜 쓸까 강한 의존성을 가진 로직들을 분리해서 코드 응집도는 높이고 결합도는 낮출 수 있다. 아래 예시 코드인 OrderFacade 는 여러 서비스에 의존하고 있어 변경에 취약하다.예를 들어 DataPlatform에 메시지를 전송하는 부분이 바뀌는 로직 변경이나, 새로운 작업이 추가된다면 OrderFacade를 직접 수정해야 하고 OrderFacade의 복잡도는 계속 증가할 것이다. 또한 특정 서비스가 실패하면 전체 로직에 영향을 미치는데 특히 주문 정보 전송이 실패하더라도 일반적으로 주문은 성공해야하는데 주문 정보 전송에 의해 주문이 실패하게 되는 상황이 발생할 수도 있다. 이는 단일책임원칙(SRP)에 위배되고 유지보수성과 확장성을 저해한다. 동작하는 전체 코드가 아닌 설명을 위해 필요한 부분만 남긴 일부 코드입니다. @Component public class OrderFacade {
     Like  Bookmark
  • 1. 배경 및 필요성 현재 이커머스 프로젝트에서는 상품 재고 관리에서 비관적 락을 사용하고 있다. 그러나 비관적 락은 트랜잭션 격리 수준을 유지하고 동시성 문제를 완화하는 데 유리하나, 높은 트래픽과 경쟁 상황에서 성능 저하를 초래할 수 있다. 이를 해결하고 시스템의 확장성을 높이기 위해 분산 락 도입을 고려하고 있으며, 특히 Redis 기반의 Lettuce와 Redisson 라이브러리의 사용을 검토하고 있다. 2. 분산 락 도입 시 고려 사항 분산 락은 여러 인스턴스 간의 락 관리를 가능하게 해 시스템 확장성과 성능을 동시에 개선할 수 있다. 다만, 효율적인 분산 락 구현을 위해서는 아래 사항들이 고려되어야 한다일관성과 데이터 무결성: 락이 걸린 동안 동일한 자원에 대해 중복 처리가 발생하지 않도록 보장해야 한다. 성능 및 지연 시간: 락 획득과 해제 시 빠른 성능을 보장해야 한다. 분산 환경에서의 안정성
     Like  Bookmark
  • 동시성 제어 방법들을 수치로 비교해서 선택하기 위해 부하테스트 도구를 활용했다. 부하테스트 도구 - Gatling 선택 이유 내가 가장 친숙한 자바 언어로 테스트코드 짜듯이 부하테스트를 작성할 수 있음 성능 테스트 후 HTML 리포트를 제공해줘서 성능 지표를 확인할 수 있음 Gradle 내 플러그인으로 지원해서 프로젝트 내에서 버전 관리를 할 수 있음 비관적락
     Like  Bookmark
  • 문제 배치를 통해 상품을 5분에 한 번씩 전체 삭제하고 insert 하는데 배치가 돌 떄마다 메인 페이지에서 상품이 보이지 않는 현상이 발생함. 해결책 트랜잭션 격리수준 변경SERIALIZABLE로 변경? 어떤 사이드이펙트가 있을까... package fnf.wp.online_store_batch.sub.category.infrastructure.batch; import fnf.wp.online_store_batch.sub.category.core.batch.GoodsImage; import fnf.wp.online_store_batch.sub.category.core.batch.ToBeGoodsDsGateway;
     Like  Bookmark
  • FizzBuzz import static org.assertj.core.api.Assertions.assertThat; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.stream.IntStream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested;
     Like  Bookmark
  • 코드 중복을 줄이기 위해서 isMain같은 boolean값을 파라미터로 보내는 게 나은가? 두 개의 메서드 차이점은 조건절에 jpaStyleKeyword.isMainDisplay.isTrue() 하나이다. package fnf.wp.online_store_backend.module.web.stylepick.adapter.out; import static com.querydsl.core.types.Projections.constructor; import static fnf.wp.online_store_backend.sub.category.infrastructure.entity.QJpaSimpleGoods.jpaSimpleGoods; import static fnf.wp.online_store_backend.sub.display.infrastructure.entity.QJpaContentGoods.jpaContentGoods; import static fnf.wp.online_store_backend.sub.stylepick.entity.QJpaStyleContent.jpaStyleContent; import static fnf.wp.online_store_backend.sub.stylepick.entity.QJpaStyleKeyword.jpaStyleKeyword;
     Like  Bookmark
  • package fnf.wp.online_store_backend.module.scheduler.launch; import fnf.wp.online_store_backend.module.core.common.core.alimtalk.adpater.in.MobilePushMessageNotifier; import fnf.wp.online_store_backend.module.core.common.core.alimtalk.domain.Message; import fnf.wp.online_store_backend.module.core.common.core.alimtalk.template.TalkManageNumberCode; import fnf.wp.online_store_backend.module.core.common.core.time.DateTimeProvider; import fnf.wp.online_store_backend.module.core.common.infrastructure.entity.enums.MallId; import fnf.wp.online_store_backend.module.core.member.member.core.member.Member; import fnf.wp.online_store_backend.module.core.member.member.core.member.MemberPort; import fnf.wp.online_store_backend.module.scheduler.launch.domain.Launch;
     Like  Bookmark
  • private void sendLaunches(@NonNull Long launchId) { val launchNotifications = launchNotificationGateway.findAllByLaunchId(launchId); val host = frontBaseUrlArgumentGateway.pc(); launchNotifications.forEach(notification -> { // db가 달라서 따로 가져옴 if (notification.memberNo() != null) { val member = memberPort.findMember( Condition.builder().memberNo(notification.memberNo()).build()); pushMessageNotifier.notify(
     Like  Bookmark
  • PRO GIT 7주 목표 1/29~3/17 버전 관리 시스템이란 파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템이슈 추적 파일 변화 비교 롤백 등을 쉽게 할 수 있다.
     Like  Bookmark
  • 1. 자바로 작성된 프로그램은 운영체제에 독립적이다. Write once, run anywhere 운영체제(OS)에 맞는 JVM(Java Virtual Machine)만 설치되어 있다면 문제 없이 동작한다.어떻게? JVM에 의해서. (JVM은 운영체제에 종속적이다.)java 소스 파일이 OS 위에서 실행되기까지의 과정을 이해해야 한다. 2. 객체지향 객체지향의 특징인 캡상추다(캡슐화, 상속, 추상화, 다형성)가 잘 적용됨 3. Garbage Collection 가비지 컬렉터가 알아서 메모리 관리를 해준다. 자동으로 관리해주기 때문에 비효율적인 면도 있지만 개발자는 프로그래밍에만 집중할 수 있다는 장점이 있음어떻게 비효율적인가?GC 실행 시점을 정확하게 알 수가 없음
     Like  Bookmark
  • 객체지향 정의 높은 응집도(기능의 집중도), 낮은 결합도(관계의 의존성)를 지향하며 유연한 소프트웨어를 추구하는 개발 기법 어떻게 유연한 소프트웨어를 추구할 수 있을까 로직 구현보다는 객체가 외부에 노출하는 인터페이스를 잘 설계하는 것 객체지향적으로 리팩토링 하면서 객체 내부와 객체 간의 관계를 깔끔하게 정리하는 것인터페이스를 통해 여러 객체와 협력하는 것 핵심 점(객체 하나 하나)보다 선(객체 간의 협력 관계)로 접근한다.
     Like  Bookmark
  • image int a = 10 메모리 0x152839 위치에서 부터 4 바이트의 공간에 있는 데이터를 10 으로 바꾸어라! 포인터 정의 메모리 상에 위치한 특정한 데이터의 (시작)주소값을 보관하는 변수 포인터는 주소 값을 보관하는 데이터의 형에 * 를 붙임으로써 정의된다.역할: 나(포인터)를 나에게 저장된 주소값에 위치한 데이터로 생각해줘! int *p; int a;
     Like  Bookmark
  • 쿼리 개선을 해보자 select god.god_no, god.erp_god_no, dcc.upper_dsp_ctgry_no as first_category_no, dccc.dsp_ctgry_nm as first_category_name, dcc.dsp_ctgry_no as second_category_no, dcc.dsp_ctgry_nm as second_category_name, dc.dsp_ctgry_no as third_category_no, dc.dsp_ctgry_nm as third_category_name, god.tag_nm,
     Like  Bookmark
  • 추상화 (abstract) 객체지향의 4대 특성 중 하나 정의공통적인 특성을 추출하는 것 예시 아우디, 벤츠, BMW 클래스가 있다면, 자동차라는 추상 클래스를 만들고 공통적인 특성을 추출해서 자동차 클래스에 정의한다. 추상 클래스 추상 클래스는 인스턴스를 생성할 수 없음
     Like  Bookmark
  • String은 immutable하기 때문에 '+' 연산 시, 새로운 String 객체를 만들어낸다. -> 메모리를 많이 사용하게 된다는 단점이 있다.사실 JDK1.5부터 내부적으로는 연산 시 StringBuilder를 사용한다. 그런데 반복문 안에서 연산을 계속한다면 StringBuilder 객체가 연산 횟수만큼 생성되기 때문에 상대적으로 느릴 수 있다. 따라서 문자열 연산이 많은 경우 StringBuilder 사용 고려 그러나 StringBuilder/StringBuffer는 mutable 하다는 차이점이 있음. StringBuilder와 StringBuffer의 차이점은? 여러 스레드에서 동시에 작업할 때 안전한지 여부 - 안전하다면? ThreadSafe 하다. - 안전하지 않다면? ThreadSafe 하지 않다고 한다. StringBuffer
     Like 1 Bookmark
  • 2023-10-15 함수형 프로그래밍 관련 코드 적용해보기scope closure curry lazy evaluation function composition scope(스코프, 유효 범위) 변수에 접근할 수 있는 범위 함수 안에 함수가 있을 때 내부 함수에서 외부 함수에 있는 변수에 접근이 가능하다(lexical scope) -> 반대(외부 함수에서 내부 함수로의 접근)는 불가능이 때 외부 함수의 변수는 선언 당시 값에서 바뀔 수 없기 때문에 final로 선언되어 있지 않더라도 암묵적으로 final 취급 -> 내부 함수에서 바꾸려고 하면 compile error
     Like  Bookmark
  • [x] MapStruct 사용해보기(ModelMapper와 차이 파악) [x] 연관관계 설정 연관관계 설정 팀과 회원 1:N의 관계 객체의 경우팀 -> 회원의 연관관계 1개 팀 <- 회원의 연관관계 1개
     Like  Bookmark
  • 개념들이 익숙하지 않다. 추후에 내부적으로 어떻게 동작하는지 알아보면 좋겠다. MySQL 아키텍처 데이터베이스는 파일을 관리하는 서버다. 서버는 MySQL Connector, SQL을 통해 MySQL 서버에 요청을 한다. MySQL 서버 MySQL 엔진 -> 스토리지 엔진 -> 운영체제 -> 디스크 MySQL 엔진 구성요소
     Like  Bookmark