분류 전체보기 2435

[아이템 56] 공개된 API 요소에는 항상 문서화 주석을 작성하라

API를 유용하게 활용하려면 명확하고 완성도 높은 문서 작성이 필요합니다. 일반적으로 API는 직접 작성되기 때문에 코드 수정 시 문서도 함께 업데이트해야 합니다. 이러한 불편한 작업을 피하기 위해 Java에서는 JavaDoc이라는 유틸리티가 도움을 줍니다. 문서화 주석을 작성하는 규칙은 공식 언어 명세에 속하진 않지만 자바 개발자라면 반드시 알아야 하는 업계 표준 API라 할 수 있습니다. 문서화 주석을 작성하는 규칙은 Oracle 홈페이지에 잘 정리되어 있지만 자바 4 버전 이후로 갱신되어 있지 않기 때문에 자바 5의 @literal과 @code, 자바 8의 @implSpec, 자바 9의 @index 관련 내용은 별도로 기재되어 있지 않음 모든 공개된 리소스에 문서화 주석을 달자 API를 올바로 문서..

JAVA/Effective Java 2024.03.13

[SpringBoot] JPA 쿼리 성능 감시 가이드

개요 팀 내 JPA 쿼리 성능 감시 가이드를 작성하는 업무를 맡은 김에 간단하게 다음 항목을 정리해 보겠습니다. JPA slow 쿼리 검출 JPA N + 1 문제가 의심되는 api 검출 JPA N + 1 문제가 의심되는 api의 경우 범고래님 블로그를 많이 참고했습니다! 감사합니다. 프로젝트 환경 SpringBoot 2.6.3 Java 1.8 Jpa slow 쿼리 검출 application.yml에 다음과 같이 설정을 하면 Hibernate에서 slow query를 로깅해 줍니다. 테스트 삼아 100ms를 기준으로 잡았고 그 결과 실행시간이 205ms인 SELECT 쿼리가 아래와 같이 로깅되었습니다. 오래 걸린 쿼리를 로깅하는 것 자체는 좋았지만 구현한 JpaRepository가 워낙 많다 보니 검출된 ..

[DEV] 기록 2024.03.12

[아이템 55] 옵셔널 반환은 신중히 하라

자바 7 버전까지는 메서드가 특정 조건에서 값을 반환할 수 없을 때 취할 수 있는 선택지가 다음과 같이 두 가지였습니다. 예외를 던지거나 null을 반환 1. 예외를 던질 때 예외는 반드시 예외적인 상황에서만 던져야 함 e.printStackTrace()와 같이 스택 추적 전체를 캡처하는 것은 비싼 작업이므로 지양해야 함 2. null을 반환 null을 반환할 수 있는 메서드를 호출할 때는 별도의 null 처리 코드를 추가해야 함 null을 반환하는 경우 항상 NPE를 조심해야 함 자바 8+ 버전부터는 위 두 가지 선택지 외 Optional이라는 또 하나의 선택지가 추가되었습니다. Optional Optional는 null이 아닌 T 타입 참조를 하나 담거나, 혹은 아무것도 담지 않을 수 있는 객체 참조..

JAVA/Effective Java 2024.03.12

[아이템 54] null이 아닌, 빈 컬렉션이나 배열을 반환하라

null을 반환하지 말자 다음 코드와 같이 컬렉션이 비어있으면 null을 반환하는 경우가 있습니다. 위 코드와 같이 null을 반환하는 경우, 클라이언트는 다음 코드와 같이 null 체크 후 적절히 처리하는 코드를 추가해야 합니다. 특히, getCheeses() 메서드와 같이 컬렉션이나 배열과 같은 컨테이너가 비었을 때 null을 반환할 경우 클라이언트는 항시 위와 같이 방어 코드를 넣어줘야 합니다. 클라이언트에서 방어 코드를 누락하면 오류가 발생할 수 있으며, 객체가 0개일 가능성이 희박한 상황에서는 엣지 케이스가 발생할 때까지 코드에서 오류를 인지하기 어려울 수 있습니다. 빈 컨테이너를 반환하는 것보다 null을 반환하는 것이 더 낫지 않나? 소제목처럼 때로는 빈 컨테이너를 할당하는 행위도 비용이 드..

JAVA/Effective Java 2024.03.11

[아이템 53] 가변인수는 신중히 사용하라

가변인수 자바 5+ 버전부터 등장한 가변인수 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있습니다. 가변인수 메서드를 호출하면 다음과 같이 처리합니다. 가장 먼저 인수의 개수와 길이가 같은 배열을 생성하고 인수들을 해당 배열에 저장하여 가변인수 메서드에 건네줌 다음 코드는 입력받은 int 인수들의 합을 계산하는 예제입니다. 위 코드에서 볼 수 있다시피 가변인수 적용 시 메서드를 보다 간결하고 유연하게 만들어주므로, 적절하게 사용하면 코드의 가독성과 유지보수성을 향상할 수 있습니다. 여기까지만 봐서는 가변인수를 무조건 적용해야 하는 것처럼 보이지만, 가변인수 사용 시 몇 가지 규칙과 주의사항이 있습니다. 인수를 0개만 받도록 설계하는 것은 좋지 않음 힙 오염 주의 성능 이슈 메서드 당 한 개의 가변인..

JAVA/Effective Java 2024.03.11

[아이템 52] 다중정의는 신중히 사용하라

다중정의(Overloading) 다중정의란 오버로딩을 의미하며 리턴 타입과 메서드명은 같으나 파라미터의 개수나 타입이 다른 메서드를 작성하는 것을 의미합니다. 다중정의로 인해 예상과 달리 오동작하는 코드들이 있는데 원인은 다음과 같습니다. 오버로딩한 메서드는 정적으로 선택 오버라이딩한 메서드는 동적으로 선택 위 내용을 완벽하게 보여주는 예제 코드는 다음과 같습니다. 코드 부연 설명 다중정의된 세 classify 메서드 중 어느 메서드를 호출할지가 컴파일 타임에 정해짐 컴파일 시점에는 for 문 안의 c는 항상 Collection 타입 런타임에는 타입이 매번 달라지지만 호출할 메서드를 선택하는 시점은 컴파일 타임이기 때문에 영향을 주지 못 함 따라서 컴파일 타임의 매개변수 타입인 Collection을 기준..

JAVA/Effective Java 2024.03.10

[아이템 51] 메서드 시그니처를 신중히 설계하라

메서드 시그니처 메서드 시그니처(Method Signature)는 메서드의 선언 부분에서 메서드의 식별을 정의하는 부분을 의미합니다. 메서드 시그니처에는 메서드의 이름, 매개변수의 타입, 반환 값의 타입이 포함됩니다. 일반적으로 메서드 시그니처는 다음과 같은 형식을 가집니다 형식 부연 설명 returnType: 메서드가 반환하는 값의 데이터 타입을 나타내며 만약 메서드가 반환하는 값이 없으면 void라고 표시 methodName: 메서드의 이름을 나타냄 parameterType1, parameterType2, ...: 메서드가 받는 매개변수의 데이터 타입 param1, param2, ...: 메서드가 받는 실제 매개변수의 이름 여기서 returnType, methodName, 그리고 parameterTy..

JAVA/Effective Java 2024.03.09

[아이템 50] 적시에 방어적 복사본을 만들라

자바의 안전성 자바는 안전한 언어입니다. 자바로 작성한 클래스는 불변식이 지켜짐 자바는 c, c++와 달리 네이티브 메서드를 사용하지 않음 c, c++는 네이티브 메서드를 사용하기 때문에 버퍼 오버런, 배열 오버런, 와일드 포인터 같은 메모리 충돌 오류로부터 안전하지 않음 방어적 프로그래밍을 해야 하는 이유 자바가 아무리 안전한 언어라고 해도 다음과 같은 이유 때문에 방어적 프로그래밍을 해야 합니다. 다른 클래스로부터의 침범을 아무런 노력 없이 막을 수 있는 것은 아님 악의적인 의도를 가진 사람들이 시스템 보안을 뚫으려는 시도가 늘고 있는 추세 휴먼 에러로 인해 클래스가 오동작하게 생성될 수 있음 따라서, 클라이언트가 불변식을 깨드리려고 노력한다고 가정하고 방어적으로 코드를 작성해야 합니다. 객체가 자기..

JAVA/Effective Java 2024.03.09

Chrome에서 ChatGPT 안되는 경우 해결 방법

2024년 3월 8일 자 기준으로 크롬에서 ChatGPT 사용 시 응답이 없는 버그가 발생했습니다. 이는 쿠키 관련 버그이기 때문에 다음 절차를 따라야 합니다. ctrl + F5를 눌러 페이지 캐시를 지우고 ctrl + shift + del을 누른 뒤 쿠키 삭제 이 과정을 거치면 자동 로그인 된 페이지들이 다 로그아웃 됨 chatgpt 다시 로그인하면 정상적으로 동작 출처 https://community.openai.com/t/chatgpt-is-not-responding-to-prompts/671804/10 ChatGPT is not responding to prompts I search about this thing there is no request in network also. community...

[DEV] 기록 2024.03.09

[Java] Lock, ReentrantLock, ReadWriteLock, ReentrantReadWriteLock

개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tistory.com/2409 [Java] synchronized, wait() & notify(), volatile, Deadlock 개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tistory.com/2392 [Java] 동기화 개념 1. 싱글 쓰레드 vs 멀티 쓰레드 프로세스는 오직 한 개의 쓰레드로만 구성하는 싱글 쓰레드 프로 jaimemin.tistory.com synchronized vs Lock 구현 Lock 구현은 synchronized 구문과 마찬가지로 상호 배제와 가시성 기능을 가진 동기화 기법 Lock 구현은 synchronized보다 더 확장된 락 작업 제공 tryL..

JAVA/RxJava 2024.03.09