JAVA

(24.04.00) Item68: 일반적으로 통용되는 명명 규칙을 따르라. ## (24.04.00) Item67: 최적화는 신중히 하라. ## (24.04.00) Item66: 네이티브 메서드는 신중히 사용하라. ## (24.04.00) Item65: 리플렉션보다는 인터페이스를 사용하라. ## (24.04.16) Item64: 객체는 인터페이스를 사용해 참조하라. ##클래스를 타입으로 사용 금지 리턴, 변수, 필드, 파라미터 타입 모두 해당. 인터페이스 타입으로 선언해라. ##다만 구현체를 갈아끼울 때 조심하자. 예를들면 A클래스의 반복자의 특정 순회 정책에 따라 주변 코드가 동작하는 상황에서, B클래스로 갈아끼우면 순회 순서를 보장하지 않아 문제가 될 수 있다. 갈아끼울 구현체는 같은 기능을 제공하고 ..
· JAVA
우리 서비스에서 일관된 데이터를 불러올 때 쿼리가 나가거나 재계산하는 것이 거슬려서 이번에 스프링 캐시를 도입해봤다. 스프링은 캐시 기능을 제공한다. 스프링 캐시 기능은 트랜잭션처럼 AOP를 통해 구현했기에 어노테이션을 사용하면 된다. 일단 간단히 어노테이션만 추가해뒀다. 현업에서 EhCache, Redis, Memcached를 많이 사용하는 것 같은데 일단은 나중에 공부 및 개선하도록 하고, 이번에는 찍먹해볼 겸 어노테이션을 통한 기본기본 캐시만 해보겠다. . . 일단 평점이랑 메뉴정보만 캐시해뒀다. 곧 코드 구조도 리팩터링 예정이라.. 남은 리뷰캐시는 그때 다시 생각해보기로 한다. 이제 로그에 잡다한 쿼리문이 안 보여서 좋다. 🪄공부 ✨ 캐시 저장소 두가지 구성방식이 있다. 하나는 JVM 로컬캐시에 ..
· JAVA
계기: 간만에 이펙티브자바 복습했다. 아래 내용을 프로젝트에 적용해보기로 결정했다! https://splendidlolli.tistory.com/672 [이펙티브 자바] null이 아닌, 빈 컬렉션이나 배열을 반환하라 ─ 8장:메서드:Item54 null이 아닌, 빈 컬렉션이나 배열을 반환하라 null이 아닌 빈 배열이나 컬렉션을 반환하라. null을 반환하는 API는 사용하기 어렵고, 오류 처리 코드도 늘어난다. 그렇다고 성능이 좋은 것도 아니다. splendidlolli.tistory.com 🪄 리팩터링 케이스 1. return값을 사용하지 않는데 null 반환을 금지해야 할까? 아래와 같이 리턴값을 사용하지 않는 메서드라도, null을 반환하지 않게 했다. (코드의 일관성, 미래의 안정성을 근거로 ..
· JAVA
🪄 발단카카오 로그인을 구현하면서 클라이언트로부터 token 값을 넘겨받는 api가 많이 생겼다. 현황은 이 token을 검증하지 않고 있었다. 그러나 안전한 서비스를 제공하기 위하여 우리가 가진 jwt secret key로 token을 검증할 필요가 있어보였다. 그래서 오늘 실행에 옮겼다. 사실 지금처럼 검증하지 않더라도 유효하지 않은 token이 넘어올 경우 그냥 개인정보를 제공하지 않도록 처리되어있어서 현재 우리 서비스에 token 검증은 필요하지 않을 수 있다고 생각할 수 있다. 그렇지만, 유효하지 않은 토큰이 넘어올 경우에 대한 관리를 일관된 장소에서 할 수 있다는 장점이 있다고 보았다. 더 나아가, 유효하지 않은 token일 경우에 수행되지 않아도 될 불필요한 비즈니스 로직, 디버깅 비용을 감..
· JAVA
🪄 문제점: ACCESS_KEY와 SECRET_KEY가 컨테이너 환경변수 지정까지는 문제 없이 되어있으나 스프링부트에서 System.getProperty("ACCESS_KEY")로 가져오지 못한다. 🪄 해결: System.getenv()는 JVM이 실행되는 OS의 환경변수를 가져오고, System.getProperty()는 JAVA 시스템 즉 JVM에서 가져오는 것이다. 다시 말해 JVM에 국한되며, 또 다시말해 플랫폼 독립적이다. 즉 이것은 시스템 환경변수를 가져오는 메서드가 아니다. 환경변수가 Java의 시스템 속성으로서 존재하는 경우만 getProperty()로 가져올 수 있다. 그러나 우리 상황에서는 Java의 변수가 아닌 OS의 환경변수를 가져오는 것이기 때문에 System.getenv()를 써..
✨ 상수 인터페이스를 사용하지 말자 인터페이스는, 구현체 인스턴스를 참조할 수 있는 타입 역할을 한다. 오직 이 용도로만 사용해야 한다! 이 지침에 맞지 않는 안티패턴은 '상수 인터페이스'이다. 상수 인터페이스는 내부 구현에 static final 필드로만 가득 찬 인터페이스다. 자바 플랫폼에도 java.io.ObjectSteamConstants 등 상수 인터페이스가 몇 개 있지만, 따라해서는 안된다. 잘못 활용한 것이므로.. 구현체가 이런 상수 인터페이스를 implements 하면 이 상수들에 종속된다. 만약 다음 릴리즈에서 상수들을 사용 안 할 거여도, 호환성을 위해 여전히 상수 인터페이스를 구현하고 있어야 한다는 문제가 생긴다. final이 아닌 클래스가 상수 인터페이스를 구현한다면, 모든 하위 클..
솔직히 이번에 공부한 내용이 와닿지 않는다. 이번 Item은 다시 학습해야 한다. 그런데 일단 래퍼클래스의 이점을 취하는 이야기가 또 나와서 좀 이 래퍼 클래스에 대해 알고 싶고, 자바의 AbstractXXX가 골격 구현 개념과 관련 있다는 것을 인지했다. 일단 내가 전체적으로 잘 모르는 것 같고, 아래 설명 중 Object 메서드들은 디폴트 메서드로 제공해서는 안 되므로, 해당 메서드들은 모두 골격 구현 클래스에 구현한다는 것도 와닿지 않는다. 재학습 대상 아이템으로 두자! ✨ 추상 클래스보다는 인터페이스를 우선하라. 자바8부터 인터페이스도 default method를 제공하므로, 인터페이스와 추상클래스 모두 '구현 메서드'를 제공할 수 있다. 다만 추상 클래스 방식은 좀 제약이 걸리는 것이, 자바는 ..
· JAVA
https://www.acmicpc.net/problem/11723 11723번: 집합 첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다. www.acmicpc.net 단순한 Set 문제다. 근데 시간 초과! 25% 시간초과 25%에서 28%까지 뚫었던 방법은, 새로운 객체 생성을 줄이는 방법으로 했다. // set과 initSet을 두고 Set set = new HashSet(); Set initSet = new HashSet(); for(int i=1; i
🪄 상속용 클래스는 신경써라 상속용 클래스는 반드시 상속을 염두에 두고 설계해야 한다(Item18). 이번 아이템에서는 상속을 고려한 설계와 문서화가 뭔지 공부한다. 상속을 허용할 클래스는, 클래스에서 재정의 가능 메서드를 호출할 수 있는 모든 상황을 문서로 남겨야 한다. 클래스의 API로 공개된 메서드에서, 클래스 자신의 또 다른 메서드를 호출할 수도 있다(자기사용). 그런데 만약 '재정의 가능 메서드'를 호출하는 형태라면, 호출하는 메서드의 API 설명에 그 사실을 적시해야 한다. 어떤 순서로 호출하는지, 각 호출 결과가 처리에 어떤 영향을 주는지 말이다. *재정의 가능이란?: public과 protected 메서드 중 final이 아닌 모든 메서드다. *백그라운드 스레드나 정적 초기화 과정에서도 호..
🪄 상속은 캡슐화를 깨뜨린다 상속은 좋은 의도로 사용된다. 1. 공통 코드를 재사용하여 중복 줄임 2. 유지보수, 확장, 유연함 등.. 그런데 상속이 캡슐화를 깨뜨린다라.. 무엇을 이야기하는 걸까? 하위 클래스들이 "상위 클래스의 변화에 종속되어 끌려다니는" 좋지 못한 상황을 이야기하는 것이다. *만약 상위 클래스가 확장을 잘 고려했고, 문서화도 잘 해두었다면 안전하여 괜찮다. *참고: 상속용으로 설계한 클래스는 하위 클래스를 만들어서 검증해야 한다. . . 상속은 상위클래스와 하위클래스가 순수한 is-a 관계일 때만 써야 한다. 무엇보다도 상속 관계는 is-a 및 is kind of 관계, 컴포지션은 has-a 및 is part of 관계라고도 할 수 있다. 예를 들어 Car is-a Automobil..
히어로맛쿠키
'JAVA' 카테고리의 글 목록