스터디/네트워크

자원을 수정하는 HTTP 메서드 - PUT vs PATCH

우아한 테크코스에서 같이 글쓰기 근로를 하는 보스독과 함께 작성한 글이다. 들어가며 웹 API를 설계할 때, 최대한 Http 표준을 따라서 용도에 맞는 Http Method를 사용해야 한다는 것은 아마 많은 개발자들이 인지하고 있을 것이다. 이번 글에서는 Http Method 중 특히 자원(엔티티)을 수정하는 용도로 사용하는 Put과 Patch에 대해 다뤄보고자 한다. 개발자들 중에는 Put과 Patch의 차이를 크게 생각하지 않고 아무거나 선택하거나 혼용하여 API를 만드는 사람도 있다. 정말로 두 메서드를 구별없이 사용해도 괜찮은 걸까!? 여기 지하철 노선 정보를 수정하는 자바스크립트 코드가 있다. 지하철 노선(Line)은 이름(name), 첫 차 시간(startTime), 마지막 차 시간(endTi..

2020.09.21 게시됨

스터디/스프링

Spring Boot 로컬 환경에서 정적 리소스 리로드 하기

로컬 환경에서 정적 리소스 리로드 하기 개요 우테코 레벨 2를 진행하면서 웹 페이지, 특히 js를 많이 작성하게 됐습니다. 그러다 보니 정적 파일(특히 js)을 수정하면 Spring boot에서 실행중이던 app을 재시작해서 수정된 정적 정보를 다시 불러와야 했습니다. Spring devtools 의존성을 추가해서 리로드 하는 방식이 있지만 빌드 속도가 느려지고 개발환경 외에 사용되지 않는 의존성을 추가하고 싶지 않았습니다. 게다가 필자는 설정해도 됐다 안됐다 하네요;; 얼마전 WebMvcConfigurer에서 resourceHandler를 다뤘는데 이를 이용하면 간단하게 해결이 된다는 것을 알게되어 공유하고자 합니다. 바라보는 정적 리소스의 위치 수정하기 아래는 이전에 작성한 classpath 아래의 ..

2020.05.22 게시됨

스터디/스프링

Spring Boot HTML 파일 templates에서도 읽도록 설정하기

static 아닌 폴더에서 정적 정보 읽어오기 스프링 부트에 web 의존성을 추가하고 localhost:8080으로 접근하면 기본적으로 resources 폴더에 있는 static 에 위치한 index.html 파일을 읽게됩니다. 프로젝트를 생성하고 다음과 같이 index.html을 생성하여 static 에 위치시키고 애플리케이션을 실행후 localhost:8080으로 접근하면 다음과 같이 index 페이지가 출력되는것을 확인할 수 있습니다. static 에서 접근하는 것은 문제가 없습니다. 그러나 html 파일들은 static이 아닌 resources 밑에 templates 폴더에서 관리를 하고 싶어진다면 문제가 발생합니다. 아래와 같이 home.html을 resources 밑 templates에 위치시..

2020.05.18 게시됨

스터디/클린코드

Jacoco Counter LINE vs INSTRUCTION

Jacoco Counter Line vs Instruction Jacoco 커버리지 종류에 여러가지가 있지만 Line와 Instruction은 비슷하지만 엄청난 차이를 일으킨다. 커버리지 측정방식이 다른데 Line의 경우 테스트 스레드가 읽고 지나간 소스 코드의 Line을 측정한다. 하지만 Instruction의 경우 지나간 바이트 코드를 측정한다. 위 두 줄을 읽고 이해가 되면 그냥 뒤로가기 눌러서 나가면되고! 이해가 잘 되지 않으면 아래 예제를 통해 확인해 보도록 하자. 설정 build.gradle에 설정은 다음과 같이 하였다. Junit5와 assertJ를 사용하기위해 의존성을 추가하였다. plugins { id 'java' id 'jacoco' } group 'org.javabom' version..

2020.03.15 게시됨

스터디/클린코드

좌충우돌 jacoco 적용기

스터디 블로그 코드블럭 상태가 이상해서 먼저 여기에 올린당.. 좌충우돌 Jacoco 적용기 백기선님의 더 자바 강의를 보던 중 바이트 코드를 다루는 방법의 예시로 jacoco가 언급되었고 테스트 커버리지를 측정하여 build를 성공, 실패 시킬수 있다는 점을 알게되었습니다. 이를 이용하여 ''스터디에서 진행하는 장기 프로젝트와 토이 프로젝트에 적용하면 재미있겠다!' 라는 생각에 적용하며 겪은 내용을 정리해 보고자 합니다! Jacoco 적용하기 단순히 적용하는 것은 어렵지 않았습니다! jacoco 유저 가이드와 우아한 형제들의 jacoco 포스팅을 보면서 쉽게 적용할 수 있었습니다. jacoco plugin 추가 먼저 plugins 블록에 id 'jacoco' 를 추가해 주면 plugins { id 'ja..

2020.02.29 게시됨

스터디/이펙티브자바

[아이템7] 다 쓴 객체 참조를 해제하라

아이템 7 다 쓴 객체 참조를 해제하라 메모리 누수의 주범이다. 사용을 마친 객체의 참조를 해제할 때 null을 이용하여 객체 참조를 해제하는 방법도 있지만, 이는 지양하도록 하라. 가장 이상적인 방법은 참조를 담은 변수를 유효 범위 밖으로 밀어내는 것이다. 캐시 또한 메모리 누수를 일으키는 주범이니, 캐시 외부에서 키를 참조하는 동안만 엔트리가 살아 있는 캐시가 필요하다면 WeakHashMap을 사용해 캐시를 만들도록 하자. @DisplayName("HashMap 테스트") @Test void test1() { //given Map map = new HashMap(); Foo key = new Foo(); map.put(key, "1"); //when key = null; System.gc(); //t..

2020.01.28 게시됨

스터디/이펙티브자바

[아이템6] 불필요한 객체 생성을 피하라

아이템 6 불필요한 객체 생성을 피하라 String.matches(String regex); String 의 matches는 반복사용할 경우 그 비용이 매우 비싸다. 내부에서 Pattern 인스턴스를 생성했다가 GC의 대상이 되기 때문이다. 이를 Pattern 인스턴스를 미리 생성한 뒤 이용하여 성능 향상을 꾀하도록 하자. 내부적으로 new Pattern(regex,0) 을 하고 있다. Map.keySet(); Map.keySet 은 매번 새로운 인스턴스를 생성하는 것 처럼 보일 수 있으나 하나의 객체만을 반환하고 있다. 어댑터의 역할은 keySet이며 뒷단 객체는 Map을 의미한다. Map의 view역할을 keySet이 하여 Set으로 보여주고 있다. 따라서 keySet으로 반환된 Set 객체에서는 a..

2020.01.28 게시됨

스터디/이펙티브자바

[아이템5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

아이템 5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. ... 이 조건을 만족하는 간단한 패턴이 있으니, 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식이다. 직접 명시되어 고정되어 있는 변수는 테스트를 하기 힘들게 만든다. 즉, 의존성을 바깥으로 분리하여 외부로 부터 주입받도록 작성하여야 한다. (의존 객체 주입 패턴) Example code public class PriceCalculateService { private static final String EXCHANGE_URL = "https://somewhere.com"; private static final double FIX..

2020.01.18 게시됨

스터디/이펙티브자바

[아이템4] 인스턴스화를 막으려거든 private 생성자를 사용하라

아이템 4 인스턴스화를 막으려거든 private 생성자를 사용하라 private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. case 정적 메서드와 정적 필드만을 담은 클래스를 만들경우 (ex. 유틸성 클래스) java.lang.Math java.util.Arrays Java.util.Collections final 클래스와 관련한 메서드를 모아 놓을 때 추상 클래스로 만드는 것은 상속을 하라는 의미로 받아 들여질 수 있으므로 인스턴스화를 막는데 아무런 도움이 되지 못한다. 기본적으로 아무런 생성자를 만들어 놓지 않으면 컴파일러가 기본 생성자를 public하게 만들기 때문에 명시적으로 private한 생성자를 만들어두어 인스턴스화를 막을 필요가 있다. 그렇지 않으면 기본 생성자를 컴파일러가 만..

2020.01.18 게시됨