일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 게이트웨이
- 백트래킹
- 이분 매칭
- 완전 탐색
- 구현
- 플로이드 와샬
- BFS
- dp
- ZuulFilter
- spring boot
- docker-compose
- 구간 트리
- 달팽이
- 스프링 시큐리티
- 메모이제이션
- spring cloud
- 비트마스킹
- 다익스트라
- 이분 탐색
- Gradle
- Zuul
- Logback
- 주울
- Java
- Spring Cloud Config
- 스택
- 유레카
- 서비스 디스커버리
- 도커
- 트리
- Today
- Total
목록프로그래밍 언어/Java (18)
Hello, Freakin world!
www.baeldung.com/jackson-ignore-null-fields Ignore Null Fields with Jackson | Baeldung Ignore null fields with Jackson 2 - either globally, per class or even per field. www.baeldung.com import static com.fasterxml.jackson.annotation.JsonInclude.Include.*; @JsonInclude(NON_NULL) public class AuthenticationResponse { ... 클래스나 필드 레벨에서 @JsonInclude(NON_NULL) 을 사용해주면 된다.
간단하게 비유하자면 이 클래스는 Map 처럼 동작합니다. 스레드의 참조를 키 값으로 하기 때문에 같은 ThreadLocal이 여러 스레드에 공유되어 값을 저장해도 특정 스레드에 저장된 값이 다른 스레드에 의해 영향받지 않습니다. 간단한 예제 코드로 확인해보겠습니다. import org.junit.jupiter.api.Test; public class TestThreadLocal { ThreadLocal threadLocal = ThreadLocal.withInitial(() -> "default"); @Test public void test() throws InterruptedException { threadLocal.set("main"); Thread myThread = new Thread(() -> ..
아래와 같은 서비스가 있다고 가정하자. public class HelloService { public String hello() throws Exception { throw new Exception("hello exception!"); } } hello 메서드는 체크된 예외를 던지기 때문에 hello를 사용하려면 try..catch로 해당 예외를 처리해야된다. public void conventionalTry() { HelloService service = new HelloService(); try { service.hello(); } catch (Exception e) { e.printStackTrace(); } } 이 방법은 코드를 읽을 때 흐름을 방해해 가독성을 떨어뜨린다. vavr 라이브러리에서 ..
if문은 코딩에서 분기를 처리하는 가장 기본적인 문법입니다. if문의 사용자체가 안티패턴을 유발하진 않습니다만, 하지만 특정 상황에 따라 if문의 사용은 코드를 어지럽힐 수 있습니다. 어떤 경우가 있을까요? 이런 경우들을 일반화시켜 하나의 문장으로 정리하면 다음과 같습니다. 1:N의 관계에서 N이 상당히 큰 경우거나 커질 가능성이 있는 경우. 특히 아키텍쳐 레벨에서 이런 식의 코드로 흐름을 제어할 경우, 정말 개발/유지하기 힘든 코드가 탄생할 수 있습니다. 상대적으로 개수가 고정적이고 확장의 폭이 좁은 '메뉴'의 핸들러 매핑과 같은 문제에 대해서는 개수가 꽤 되더라도 if문 분기를 이용해서 해결할 수도 있습니다. N이 그리 크지 않다면 if문이 더 편한 경우도 분명히 존재한다고 생각합니다. 그렇다면 대안..
Thread api 중 destroy, stop, suspend 등이 안전 상의 이유로 폐기됐습니다. 스레드를 강제로 종료시키던 destroy()는 사전에 자원의 cleanup 작업을 하지 않습니다. 그래서 때때로 monitor가 락을 유지한 상태로 내버려두기도 해, 데드락 유발의 원인이었다고 하네요. https://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html Java Thread Primitive Deprecation Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated? Why is Thread...
용도는? volatile의 용도는 다중 스레드 프로그래밍에서 변수 메모리의 위치를 스레드의 로컬(위의 Working Memory)이 아니라 Main Memory에 생성함으로서 일관성있는 데이터의 참조가 가능한 변수를 만들기 위함입니다. 하지만 과연 스레드 세이프할까요? 스레드 세이프 한가? 만약 volatile을 적용한 변수에 대해서 읽고 쓰기만 한다면 스레드 세이프합니다. 하지만 volatile변수의 연산 결과를 로컬 변수에 저장하고, 다시 이 로컬 변수를 volatile변수에 할당하는 경우에 데이터의 일관성이 깨질 수 있습니다. volatile int n = 1; public void modify() { int temp = n + 1; n = temp; } 위의 경우에서 n+1 연산을 하는 도중 다른..
이걸 알아내서 뭐하냐 싶기도 하지만, 이걸 알아야만 구현이 가능한 것들이 있었다. 예를 들면, Spring에서 지원하는 @RequestMapping(url = "/hello/{id}") 에서 요구되는 기능들이다.스프링에서 위 애너테이션은 url을 매핑할 뿐만 아니라 인수 중 id와 이름이 같은 인수에 값을 바인딩해준다. 이를 구현하기 위해서는 메서드 인수의 이름을 알아야 한다. 그래야 이름을 이용해 인수가 선언된 순서를 알 수 있고, 순서를 알아야 순서에 따라 해당값들을 바인딩해서 넘겨줄 수 있다.(자세한 구현은 나중에 토이 프로젝트에 이 부분을 정리할 예정이다.) 그런데 인수의 이름을 알려면, 단순하게 api만 사용해서 알아낼 수 없다는게 문제다.컴파일 옵션에 "-parameters" 추가해줘야 한다...
plugins { id 'java' } group 'org.example' version '1.0-SNAPSHOT' sourceCompatibility = 12 tasks.withType(JavaCompile) { options.compilerArgs.add("-parameters") } 핵심이 되는 코드는 맨 아래부분 tasks.~ 부분이다. 위는 그루비라는 언어로 작성됐다. 하지만 자바와 비슷한 구석이 많아, 자바만 알아도 얼핏 이해는 된다. JavaCompile 은 Task의 타입 이름이다. Gradle은 빌드에 필요한 기능에 따라 Task라는 것으로 그룹화했다. JavaCompile 관련은 Gradle 공식 문서에서 이 부분을 뒤져보면 알아볼 수 있다. JavaCompile는 options 라는 ..
자바에서 정규표현식을 사용하기 위해 알아야 하는 클래스는 두 가지입니다. Pattern 과 Matcher 클래스입니다. (api 자체에 대한 설명은 넘어가겠습니다. 너무 간단하기 때문입니다!) 일단 예제를 통해 살펴보겠습니다. import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexExample { @Test public void testRegex() { String source = "/hello/{id}/{name}"; // 찾을 대상이 포함된 전체 문자열 Pattern pattern = Pattern.compile("\\{[\\w\\d]+\\}"); // 찾고 싶은 문자열 혹은 문자열의 패턴 Matcher ma..
오해 동기 방식의 IO 작업에서 서버소켓은 한 클라이언트와 통신 중일때, 다른 클라이언트와 통신할 수 없다. 그래서 나는 서버소켓에서 accept()를 호출하면 서버소켓과 클라이언트 소켓이 서로 1:1로 연결되는 이미지로 이해했는데, 이는 2퍼센트 부족한 이해였다. 부족했던 2퍼센트 때문에 어떻게 동기방식의 서버가 다수의 클라이언트의 요청을 처리하게 만들지 상당히 고민했었는데, 몇몇 예제들을 살펴보니 내가 accept()의 동작 방식을 완전히 잘못 이해하고 있다는 것을 깨달았다. 추정 이 그림은 동작테스트를 통해 내가 추정하는 모델이다. 클라이언트에게 공개되는 entry port가 존재한다. accept는 entry port로 접근하는 클라이언트 소켓을 내부에서 자동 지정된 포트 번호의 소켓에 매핑해주는..