본문 바로가기
반응형

Java9

Lazy 로 쿼리를 날리고 싶다면? 문제 aService 로직을 실행하고, 실행 환경이 release 환경이라면 bService 로직을 추가로 실행하는 코드가 있다. public void run(Model model) { model.addAttribute("play1", aService.play()); boolean isRelease = DeployUtils.isRelease(); if (isRelease) { model.addAttribute("play2", bService.play()); } } 문제는 이 코드가 대략 10 군데 정도의 Controller 에서 사용되고 있어 중복처럼 보였다. 중복을 제거하기 위해 BaseController 를 만들고, 해당 코드를 설계했다. BaseController public void add(Mod.. 2023. 9. 12.
힙 덤프 (Heap Dump) 이전에 운영 어드민 서버가 갑자기 죽는 현상이 발생했다. 로그를 살펴보니 OOM 이 발생해서 서버가 다운됬는데, 정확한 원인 파악이 안되어서 선배 개발자분이 HeapDump 를 떠서 원인 파악을 했던 경험이 있다. 그 기억을 살려 힙 덤프 뜨는 법을 알아보자. 힙 덤프 뜨는 방법 먼저 운영 커버로스 서버로 접속한다. 그 후 아래 명령어로 실행중인 프로세스를 조회한다. ps -ef | grep [프로세스이름] ex ) ps -ef | grep 'gostop' 그러면 프로세스 번호를 알 수 있게 되는데, 해당 프로세스 번호로 힙 덤프를 뜨면 된다. jmap -dump:format=b,file=[힙덤프 파일명].hprof [PID] ex ) jmap -dump:format=b,file=testd.. 2022. 7. 28.
Json 을 객체로 변환 시 boolean 타입 변수 인식 못하는 문제 문제 @Getter class A { private int resultCode; private String resultMessage; private boolean isSuccessful; } 위와같이 지정하고 Json 을 Object 로 변환하는데 이상하게 boolean 타입의 isSuccessful 만 Unrecognized field 에러가 발생하면서 매핑을 하지 못했다. 원인은 primitive boolean 타입의 변수명이 is 로 사작하면, 실제 변환 시 is 가 생략되기 때문이었다. 해결 방법 1 해당 변수에 @JsonProperty("isSuccessful") 어노테이션을 붙여 이름을 명시적으로 적어준다. @JsonProperty("isSuccessful") private Boolean is.. 2022. 2. 16.
[이펙티브 자바] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴 인스턴스를 오직 하나만 생성할 수 있는 클래스 ex ) 무상태 (stateless) 객체, 설계상 유일해야 하는 시스템 컴포넌트 장점 고정된 메모리 영역을 사용하므로 메모리 낭비 방지 전역 인스턴스이므로 다른 클래스의 인스턴스가 데이터 공유하기 쉬움 인스턴스가 1개임을 보장 두 번째 이용 부터는 객체 로딩 시간이 줄어 성능 향상 단점 테스트가 어렵다. 싱글턴 인스턴스를 가짜 (mock) 구현으로 대체할 수 없기때문 결합도가 높아진다. 싱글턴 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시키면 결합도가 높아져 OCP를 위배함 코드 수정이 어려워지며 유지보수 비용이 높아진다. 멀티 쓰레드 환경에서 동기화 처리를 안하면 인스턴스가 2개 생성될 수 있는 위험성이 생긴다. 싱글턴을 만드는 방식 방법.. 2021. 5. 31.
LinkedList 연결리스트란? 연결리스트는 원소들을 저장할 때 그 다음 원소가 있는 위치를 포함시키는 방식으로 저장하는 자료구조이다. 선형, 비선형 자료구조 선형 자료구조 : 배열, 연결리스트 👉 면접에서 둘의 차이를 설명하는 문제가 자주 나옴 비선형 자료구조 : 트리, 그래프, 해쉬 배열 vs 연결리스트 k 번째 원소 조회, 변경 배열 : O(1) 연결리스트 : O(k) 👉 배열과 다르게 공간에 원소들이 연속해서 위치하므로 임의의 위치에 원소를 추가, 제거 배열 : O(N) 👉 중간 삽입 시 그 뒤의 원소들을 전부 한 칸씩 밀어야하므로 연결리스트 : O(1) 마지막 위치에 원소 추가, 제거 배열 : O(1) 연결리스트 : O(1) 메모리 상의 배치 배열 : 연속 연결리스트 : 불연속 추가적으로 필요한 공간 (Overh.. 2021. 5. 30.
[이펙티브 자바] 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라 정적 팩터리, 생성자는 선택적 매개변수가 많을 때 대응하기 어려운 문제가 있다. 이때, 점층적 생성자 패턴을 사용할 수 있다. 점층적 생성자 패턴 쉽게 말해서 매개변수 마다 생성자를 늘려가는 방식이다. (매개변수 1개 생성자, 매개변수 2개 생성자...) 하지만 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기가 어렵다는 단점이 있다. 각 값의 의미 파악이 어려움 매개변수가 몇 개인지 파악해야함 타입이 같은 매개변수가 있으면 버그가 발생할 때 찾기 어려움 실수로 매개변수 순서를 바꿔도 버그가 발생할 수 있음 자바빈즈 패턴 (JavaBeans pattern) 점층적 생성자 패턴의 대안으로, 매개변수가 많을 때 자바빈즈 패턴을 사용할 수 있다. 매개변수가 없는 생성자로 객체를 생성 후, setter.. 2021. 5. 25.