본문 바로가기

분류 전체보기621

[Java] 템플릿 메서드 패턴, 전략 패턴, 템플릿 콜백 패턴 템플릿 메서드 패턴 템플릿 메서드 패턴이란, 여러 클래스에서 공통으로 사용하는 메서드를 템플릿화하여 상위클래스에서 정의하고 하위 클래스마다 세부 동작을 다르게 구현하는 패턴이다. 템플릿 메소드 패턴은 상속이라는 기술을 극대화하여, 알고리즘의 뼈대를 맞추는 것에 초점을 둔다. 변하지 않는 템플릿(기능)은 상위 클래스에만 만들어두고 자주 변경되며 확장할 템플릿(기능)은 하위 클래스에서만 만든다. 이렇게 하 면 자식 클래스가 알고리즘의 전체 구조를 변경하지 않고, 특정 부분만 재정의할 수 있는데 하위 클래스를 사용해 상속과 오버라이딩을 통 한 다형성으로 문제를 해결하는 것이다. 템플릿 메서드 패턴은 클래스를 계속 만들어야 하는 단점이 있는데 익명 내무 클래스를 사용하면 이러한 단점을 보완할 수 있다. 익명 내.. 2024. 4. 18.
[Java] 스레드 로컬 - Thread Local 스레드 로컬이란 여러개의 스레드가 존재할 때, 해당 스레드만 접근할 수 있는 특별한 저장소를 말한다. 스레드 로컬 클래스는 한 스레드에 의해 읽고 쓰여지는 변수를 생성한다. 각 스레드마다 별도의 내부 저장소가 제공된다. 스레드 로컬을 사용하는 이유 , 동시성 문제 서로 다른 두 스레드가 하나의 변수에 접근해 동시에 값을 변경한다면 이 변수는 공유 자원으로 동시성 문제가 발생할 수 있다. 동시성 문제는 트래픽이 적은 상황에서는 괜찮은데 트래픽이 많아질수록 자주 발생한다. 또한 스프링 빈처럼 싱글톤 객체의 필드를 변경하며 사용할 때도 동시성 문제에 대해 조심해야 한다. 이러한 문제를 해결하기 위해 스레드 로컬을 사용한다. 스레드 로컬 사용 시 주의사항 스레드 로컬을 모두 사용하고나면 remove 메서드를 호.. 2024. 4. 14.
[Gradle] Gradlew 빌드 시 gradle 다운로드 속도가 느릴 때 이미지 빌드 중 ./gradlew 실행을 위해 gradle 다운로드하는데 시간이 너무 오래걸리는 문제가 있었다. 빠를때도 있고 느릴때도 있었는데 계속 기다릴 수 없기에... 해결해보는걸로 하자. 찾아보니 종종 배포파일 다운로드가 느리다는 것 같았다. 해결 방법으로는 다운로드 받는 gradle 주소를 변경해서 진행하면 된다. 파일 위치는 gradle/wrapper/gradle-wrapper.properties 에 있고 distributionUrl 에 있는 주소를 변경해주면 된다. Downloading https://services.gradle.org/distributions/gradle-[버전]-bin.zip Downloading https://downloads.gradle.org/distributions.. 2024. 4. 3.
[Spring] Thread Pool - pool size설정 Thread Pool Thread Pool 은 여러 개의 쓰레드를 유지하고 관리하기 위해 사용된다. Thread Pool 의 사이즈 쓰레드를 불필요하게 많이 만들게 되면 메모리의 낭비가 심해지고 너무 적은 수의 쓰레드를 만들게 되면 효율성이 떨어진다. 쓰레드의 개수를 고정 시키는 것보다 서비스가 실행되는 CPU의 코어 개수에 따라 유동적으로 생성할 수 있도록 해주는 것이 좋다. 많이 생성하는 것이 아니라 어떤 작업을 처리하느냐에 따라 기준이 바뀔 수 있다. CPU 처리가 많은 경우 - CPU 코어가 N개인 경우 N+1만큼의 쓰레드를 생성해주면 최적에 가까운 성능을 낼 수 있다고도 한다. I/O 작업이 많은 경우 - N*2 만큼의 쓰레드를 생성해준다. 2024. 3. 26.
[Querydsl] Resolved [com.querydsl.core.types.ExpressionException ~ ] selet 문에 내가 원하는 값으로 리턴하기 위해 Querydsl 에서 Projections.fileds를 사용하는데 다음과 같은 에러가 발생했었다. @Override public List getMasterIdList(Long memberId) { return jpaQueryFactory.select( Projections.fields(AnswerDTO.class, answer.answerId.as("answerId"), answer.answerId.count().coalesce(0L).as("answerCount")) ) .from(answer) .where(answer.mberId.eq(memberId)) .fetch(); } Projections의 경우 생성자 기반이 아닌 필드 기반으로 가져올 때 .. 2024. 3. 22.
[Git] error: The following untracked working tree files would be overwritten by checkout: develop 브랜치에서 다른 feature 브랜치로 checkout 하는데 다음과 같은 에러가 발생했다. error: The following untracked working tree files would be overwritten by checkout: 해결방법 추적하지 않는 파일을 제거하면 된다. # == 적용하지 않고 무엇을 해야할 지만 보고 싶을 때 == git clean -fd --dry-run # 또는 git clean -fdn # == 적용하고 싶을 때 == git clean -fd 2024. 1. 30.