Study

    테스트 코드와 의존성 주입

    톰 롱의 를 읽다가 메모 테스트 코드 작성 시 의존성 주입 사용에 대해 설명하기 위한 예시가 이메일 발송과 관련되어 있다. 이메일 발송 기능이 들어가는 테스트 코드를 작성했던 개인적인 경험(흑역사)이 떠올랐다. 당시 작성했던 코드의 문제를 깨달은 과정을 적어본다. 작가는 아래 두 클래스의 예를 들어 의존성 주입을 사용하면 테스트 용이성이 크게 향상된다고 한다. 의존성을 주입하지 않은 클래스 (not good) // 고객에게 송장 리마인더를 보내는 클래스 class InvoiceReminder { private final AddressBook addressBook; private final EmailSender emailSender; // 여기를 보자! // 의존 객체가 생성자에서 생성된다. // 하드 코..

    DB 계층 구조 설계 - 클로저 테이블 패턴

    계층 구조인 조직도 테이블을 설계하게 되었다. 0. 기존에 접하던 테이블 구조 테이블 하나 id 컬럼 | 부모_id 컬럼 | 기타 컬럼 계층형 쿼리 사용 프로젝트에서 자주 보던 계층형 쿼리는 한 번에 이해하기에 어렵다고 느꼈었다. 계층이 깊은 경우는 더더욱. 나는 이해하기 쉬운 코드가 좋다. 이번에 테이블 설계를 하면서 이해하기 쉬운 쿼리를 쓸 수 있는 방법이 없나 찾아봤다. 그러다 빌 카윈 Bill Karwin이라는 개발자의 아래 자료를 보게 되었다. 자료에 대한 간단한 요약과 적용한 결과(MySQL)를 공유하고자 한다. https://www.slideshare.net/billkarwin/models-for-hierarchical-data Models for hierarchical data Tree-l..

    자바로 간단한 http 웹 서버 구현

    자바지기님의 유튜브 영상과 자료를 참고하여 실습을 진행한다. 기본으로 제공되는 프로젝트가 있으며 요구사항에 맞춰 코드를 발전시킨다. 요구사항마다 힌트가 있으나 우선 스스로 구현 방법을 생각해본다. https://www.youtube.com/watch?v=qgFVj916nX8&list=PLqaSEyuwXkSqV88SwDxuY56xmj6KsmzRN&index=1 https://www.slideshare.net/javajigi/http-web-server HTTP web server 구현 자바 기반으로 web server를 직접 구현하면서 HTTP 동작 원리에 대해 이해한다. www.slideshare.net 개발 환경 설정 지난 번의 간단한 자바 통신 구현에서 봤던 내용들이다. 프로젝트(위 슬라이드에 깃허브..

    간단한 자바 TCP 통신 구현

    TCP 연결 지향적 프로토콜 (1) 클라이언트가 연결 요청, 서버가 연결 수락하면 통신 선로 고정 (2) 통신 선로를 통해 데이터가 순차적으로 전달 ServerSocket과 Socket 자바는 java.net.ServerSocket과 java.net.Socket을 제공한다. ServerSocket은 클라이언트의 연결 요청 대기, 연결 수락 역할을 한다. Socket은 두 서버 간의 통신에서 데이터를 주고 받는 엔드포인트 역할을 한다. I/O Stream 통신이 연결되었다면 엔드포인트에서 데이터가 왔다갔다 한다. 자바에서 데이터는 Stream을 통해 이동한다. Stream은 단방향이므로 데이터 발신, 수신을 위한 Stream이 각각 필요하다. OutputStream 발신을 위한 스트림이며 바이트 기반 출력..

    자바 빌더 패턴 Java Builder Pattern

    무한 생성자 오버로드(overload) 이미 생성자 오버로드가 너무 많았고 나도 거기에 하나를 더 추가해야 하는 상황이 있었다. 생성자를 호출할 때 매개변수에 대한 정보를 알 수 없는 점이 너무 불편했고 코드도 쓸데없이 너무 길어졌다. // 예시 public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; public NutritionFacts() { this(0) } public NutritionFacts(int servingSize) { this(servingSize, 0) } public NutritionFact..

    JUnit은 JVM에서 돌아가는가?

    게슈탈트 붕괴 마냥 갑자기 JUnit은 JVM에서 돌아가는가? 하는 의문이 생겼다. 내가 JUnit에 대해 이미 알고 있는 내용은 자바 테스트를 하기 위해 JUnit라는 걸 쓴다 자바 언어로 작성한다 org.junit.. 어쩌구 등의 패키지가 있다 IDE를 통해 run 실행하거나 maven, gradle 등을 통해 test 실행한다 자바 코드를 테스트하기 위한 수단이며 그 자체가 자바와 긴밀하다는 건 알겠다. 그래서 JVM에서 돌아가는 건가? 1. JUnit은 유닛 테스트를 위한 자바 프레임워크다. 개발자가 테스트 코드를 만들면 프레임워크는 제어권을 가로채 주도적으로 실행한다. 나는 은연 중에 개발 코드와 테스트 코드를 별개로 생각하고 있었기에 저런 의문이 생겼던 것 같다. 그 둘은 별개가 아니라 같은 ..

    PostgreSQL 쿼리 무한 로딩 idle in transaction 해결

    한줄 요약: pid 조회하고 select pg_cancel_backend(pid);로 세션 취소 DROP INDEX 인덱스명; 을 실행했더니 무한 로딩이 걸린다. Oracle에서 update문을 실행하다가 고생한 경험을 떠올렸다. 네트워크 연결이 불안정한 작업 환경에서 운영 DB에 커밋을 하다가 무한 대기가 걸려서 아주 많이 당황했었고 lock이 원인이란 걸 파악한 뒤 DBA에게 session kill을 요청하여 해결했었다. 그러니 우선 현재 실행 중인 프로세스의 lock 정보를 보여주는 pg_locks view를 조회해보자. Lock 정보 조회 select * from pg_locks l, pg_stat_all_tables t where l.relation = t.relid order by relati..

    Spring Service단에 Interface가 필요한가?

    개인적으로 신규 프로젝트가 좋은 이유는 코드 구조를 바꿔볼 수 있기 때문이다. 기존 프로젝트의 코드를 리팩토링하기란 촉박한 일정에 맞춰 많은 기능을 구현해야 하는 업무 상황상 현실적으로 쉽지 않다. 이 기회를 노려 구조를 바꿔보던 중 Spring Service단에 Interface가 필요한가? 라는 질문을 받게 되었다. 1. 기존에 접하던 구조 Controller단에서 비즈니스 로직 처리 후 바로 DAO 호출하는 코드가 많음 즉 Controller단과 Service단의 분리가 되어있지 않음 특정 조건에 따라 데이터를 가공하는 로직을 이해하는데 시간이 너무 많이 소모된다 중복 로직이 생길 경우 코드는 미친듯이 늘어난다 이번 프로젝트에 REST API를 적용하게 되었고, 그 정신에 알맞게 Controller..