일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 구현
- docker-compose
- ZuulFilter
- 서비스 디스커버리
- 이분 매칭
- 다익스트라
- BFS
- 메모이제이션
- 구간 트리
- 완전 탐색
- 이분 탐색
- 달팽이
- spring boot
- 게이트웨이
- 스택
- Java
- 플로이드 와샬
- 유레카
- Spring Cloud Config
- Logback
- 백트래킹
- dp
- Zuul
- 트리
- 스프링 시큐리티
- 도커
- 주울
- spring cloud
- Gradle
- 비트마스킹
- Today
- Total
목록프로그래밍 언어 (22)
Hello, Freakin world!
우선 1번 글에서 지적한 문제를 해결한 코드부터 살펴보겠습니다. import kotlin.reflect.KParameter class ModelMapper { /** * 반환 클래스의 주 생성자를 통해 값을 바인딩하고 반환하는 mapper */ inline fun mapper(source: T): R { R::class.constructors .last { constructor -> val mutableMap: MutableMap = mutableMapOf() constructor.parameters.forEach { parameter -> mutableMap[parameter] = T::class.members.find { it.name == parameter.name }?.call(source) } ..
우선 ModelMapper를 간단히 소개하자면, http://modelmapper.org/ ModelMapper - Simple, Intelligent, Object Mapping. Why ModelMapper? The goal of ModelMapper is to make object mapping easy, by automatically determining how one object model maps to another, based on conventions, in the same way that a human would - while providing a simple, refactoring-safe API for handli modelmapper.org 위 사이트에서 제공하는 자바 기반의 객체 ..
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 라는 ..