전체 글

전체 글

    CS 공부 - Spring

    WAS(Web Application Server)와 WS(Web Server)의 차이 Web Server는 정적인 데이터를 처리하는 서버 Web Server에는 NginX, Apache 등이 있음 Web Application Server는 Web server에 Web Container를 추가한 것으로 Web Container에서 서블릿, Java code 등을 수행하여 동적인 데이터를 처리하는 서버 Web Application Server에는 Tomcat, JBoss 등이 있음 두 서버 모두 HTTP 프로토콜을 기반으로 함 Spring Framework란? Spring Framework는 Java 개발을 편리하게 해주는 오픈소스 프레임워크 경량 컨테이너로 자바 객체를 담고 직접 관리함 객체의 생성, 소멸..

    CS 공부 - HTTP

    CS 공부를 진행하며 정리해두거나 새롭게 공부한 내용을 정리하여 업로드하려 합니다. 내용 형식은 줄글이 아니라 노트 정리와 같은 불릿 형식이므로 참고바랍니다. HTTP는 인터넷에서 데이터를 주고받을 수 있는 프로토콜 HTTP는 클라이언트의 요청과 응답이 있음 각 요청과 응답은 HTTP 메시지로 이루어짐 HTTP 메시지는 시작줄, 헤더, 본문으로 이루어짐 요청 메시지 시작줄 : 메서드, 주소, HTTP 버전 헤더 : 요청에 관련된 정보를 담고 있음 본문 : 요청할 때 함께 보낼 데이터를 담음 응답 메시지 시작줄 : HTTP 버전, 상태코드, 상태 메시지 헤더 : 응답에 대한 정보를 담고 있음 본문 : 요청에 대한 응답 데이터를 담음 HTTP 메서드(GET, POST, PUT, PATCH, DELETE 외)..

    WebMvcTest에서 MockMVC로 실패 테스트하기

    프로젝트를 진행하면서 여러 테스트 코드들을 작성했다. 문제는 MockMVC를 사용해 컨트롤러 테스트를 작성할 때 발생했는데, 컨트롤러 실패 테스트에서 예외를 던지고 그에 맞는 HttpStatus를 발생시키는지 확인해야했었고 계속 제대로 발생시키지 못하는 문제가 있었다. 먼저 구성된 코드를 보자. CreatorNotFoundException, @RestControllerAdvice가 있는 GlobalExceptionHandler, CreatorService가 있다. CreatorNotFoundException은 발생시킬 예외이다. MESSAGE와 Httpstatus를 가지고 있고 BusinessException을 상속한다. import org.springframework.http.HttpStatus; pu..

    당근마켓 클론코딩 - 1. 인접 동 조회 기능 구현하기

    생각한 사항 당근마켓의 내 주변 동네 범위 설정 로직은 어떻게 구현되어 있을까? 추측해보자 주민 센터의 위치 좌표에 대해 거리의 크기 기준으로 단계별 설정 BFS 알고리즘을 통한 인접 동 탐색 대중 교통의 소요 시간을 기준으로 가까운 순으로 단계별 설정 일단, 1단계는 이름이 같은 것 기준(포함 관계) ex) 삼성 1동 → 삼성동 결론 완벽히 해결하진 못했지만 기사를 통해 2~6km 반경의 동네 범위를 기준으로 탐색한다고 하는 사실을 알게됨 우리는 거리 기준으로 검색을 수행하도록 결정함 어차피 인접 동네는 잘 변하지 않는 데이터이므로 MySQL에서 거리 기준으로 검색을 통해 인접 동네 리스트를 생성하여 MongoDB에 저장하면 1번의 계산 로직을 수행하여 인접 동네가 변하는 순간까지 계속 조회할 수 있다..

    당근마켓 클론코딩 - 게시글 검색 기능 구현을 위한 실험

    게시글 검색 기능을 구현하기 전에 검색 기능을 수행할 수 있는 여러 방법들에 대해 성능을 비교하고 가장 좋은 방법을 선택해보자! 당근마켓 검색로직을 분석하다 알게된 사실(추측이니 너무 믿지는 말자!) 당근 마켓의 검색 시스템은 검색어를 띄어쓰기 단위로 분절하여 검색하는 듯하다. 예를 들면, "구찌" 를 검색하면 그에 대한 결과가 잘 나오지만 "구 찌"로 검색하면 "구"가 포함된 단어와 "찌"가 포함된 단어가 "모두"있는 결과만 나오게 된다. 이로써 검색어의 띄어쓰기 단위로 분절하고 분절된 단어들은 AND 연산으로 묶여 질의되는 것으로 추측하여 이에 맞게 구현했다! 성능 체크하기 성능 측정을 위한 비교 대상은 3가지로 삼았다. 일단 검색의 기본이라고 생각하는 Like "%query%" 문, MySQL Fu..

    정적 팩토리 메서드

    정적 팩토리 메서드에 대해 알아보자 정적 팩토리 메서드는 팩토리 패턴에서 용어를 가져와 정의한 기법으로 객체 생성 메서드라고 정의한다. 정적 팩토리 메서드를 객체 생성 메서드라고 정의했는데 우리에겐 생성자가 있지 않은가? 그런데 왜 생성자를 통해 인스턴스를 생성하지 않고 static 메서드를 활용해서 생성할까? ‘이펙티브 자바’에서는 정적 팩토리 메서드에 대한 장점을 설명한다. 정적 팩토리 메서드를 사용했을 때의 장점 1. 이름을 가질 수 있다! new 키워드를 통해 인스턴스를 생성하는 생성자를 사용한 방법은 그저 단순히 인스턴스를 생성한다는 의미를 가질 뿐이지 이 로직이 어떤 의미를 가지는 지는 설명하지 못한다. 하지만, 정적 팩토리 메서드는 메서드가 이름을 가지기 때문에 생성 로직에 대한 의미를 나타..

    Logback.xml 동일 패키지 내 다른 레벨 처리

    동일 패키지 내에서 Console 로그 출력은 info 레벨부터, File에 로그 저장은 Error 레벨만 하고 싶은 경우가 있다. 이럴 때 좋은 문제 해결 방법을 찾았다. 앞서 설명했듯이 file 에는 ERROR 로그만 저장하고 콘솔에는 Info 레벨부터 출력하고 싶을 때가 있다. 그리고 해당 작업을 프로젝트의 전체 패키지 내에서 진행하고 싶은 경우에 단순히 logback.xml 에서 동일한 이름의 들을 생성해서는 해결되지 않았다. 위 사진처럼 org.xxx.basic 패키지에서 STDOUT 이라는 콘솔 출력 로그는 info 레벨부터, org.xxx.basic 패키지에서 ROLLING_FILE 이라는 파일 출력 로그는 error 레벨부터 수행하도록 logback.xml 을 꾸미면 될 줄 알았는데 안됐다..

    Garbage Collector 동작원리

    GC의 동작 원리에 대해 정리해 본 글입니다. Garbage Collector 힙 메모리 영역 중 더 이상사용하지 않는 자원을 찾아내어 해제하는 기능 프로그램의 실행 중간에 쓸모 없는 메모리를 알아서 수집/삭제 메인 쓰레드와 별개로 백그라운드로 데몬 쓰레드에서 GC를 수행 힙 메모리와 GC 힙 메모리는 JVM 메모리 영역 중의 하나로 new 키워드를 통해 동적으로 할당된 객체들을 저장하는 공간이다. 힙 메모리에 저장된 객체에 대해 GC가 돌면서 더이상 참도되지 않는 객체를 판별하고 제거한다. 힙 메모리는 모든 쓰레드가 공유하는 공간이고 JVM이 실행될 때 생성된다. 힙 영역은 대부분의 객체는 일회용이며 오래동안 메모리에 남아 있는 경우는 드물다는 조건하에 설계되었다. 따라서, 내부적으로 객체의 생존기간에..