Hoo, I am

junior_datalist

  • 분류 전체보기 (344)
    • Backend (96)
      • ☕️ Java (32)
      • 🌿 Spring (35)
      • 🩵 Go (7)
      • 🔗 Kafka (3)
      • 🐍 Python (17)
    • Frontend (27)
      • React (9)
      • JS (18)
    • 🌐 Web (13)
    • ☁️ Cloud (10)
      • ⚓️ Kubernetes (0)
    • 💡Database (1)
    • 📔 TIL (98)
    • 📚 Book (6)
      • Core Javascript (2)
      • 데이터 중심 애플리케이션 설계 (3)
    • 🔱 Algorithm (53)
      • DP (7)
      • BFS DFS (3)
      • Greedy (7)
      • Back tracking (2)
      • Else (18)
    • 🤿 숨참고 Deep Dive (3)
    • 📝기록 (20)
      • 후기 (3)
07-21 12:23
  • 홈
  • 태그
  • 방명록
로그인
로그아웃 글쓰기 관리

junior_datalist

컨텐츠 검색

태그

데이터중심애플리케이션설계 리눅스 디렉토리 삭제 회고 Nullish Coalescing Operator query parameter string 모든개발자를위한http웹기본지식 JavaAppletPlugin 커밋되돌리기 로또의최고순위와최저순위 파이썬 백준 2346 파티션할당전략 스프링부트3 어드바이드 기억보단기록을 포인트컷 npm맥윈도우 gitreset 자바스크립트 map 객체 null 병합 연산자 글또

최근글

댓글

공지사항

  • About me

아카이브

Backend(96)

  • [Spring] 동적 프록시 기술 (2) - JDK DynamicProxy

    동적 프록시 기술은 언제 사용될까? 프록시 기술을 적용하기 위함인데, 앞에 동적이라는 단어가 왜 붙었는지 생각해보자. 만약 100개의 클래스가 프록시 적용 대상이라고 하자. 그럼 100개의 클래스에 적용할 100개의 프록시를 개별적으로 만들어야할까? 단순 로그를 적용하는 기능의 프록시라면, 로직은 같은데 적용 대상에만 차이가 있는 것이다. 이 문제를 해결할 수 있는 것이 동적 프록시 기술이다. 동적 프록시 기술을 활용하면 개발자가 매번 프록시 클래스를 만들지 않아도 된다. 이름대로 프록시 객체를 동적으로 런타임에 (개발자 대신) 만들어준다. 그럼 코드를 보면서 어떤식으로 동적 프록시가 생성되고 적용되는지 확인해보자. 참고로 JDK 동적 프록시는 인터페이스를 기반으로 동적 프록시를 생성하기 때문에, 인터페..

    2022.06.02
  • [Spring] 동적 프록시 기술(1) - 리플렉션

    로깅등의 부가 처리 기능을 위해 프록시 클래스를 매번 만들기엔, 적용 대상 클래스 수 만큼 프록시 클래스를 만들어야 하는 문제가 있다. 로그 추적을 위한 프록시 클래스의 소스코드는 거의 같은 모양을 하고 있다. 같은 모양의 클래스를 여러개 만드는 것은 비효율적일 뿐더러 SRP 원칙을 위배하기 때문에, 동적 프록시 기술을 활용하여 이 문제를 점진적으로 해결해보자. 리플렉션 이란? 객체를 통해 클래스의 메타정보를 분석하는 프로그램 기법을 의미한다. 투영, 반사라는 사전적 의미를 가지는데, 클래스의 메타정보를 투영한다고 이해하면 된다. 그럼 뭐하러 굳이 객체를 통해 클래스의 정보를 알아내야할까? 구체적인 클래스의 타입을 알지 못해도, 해당 클래스가 가지고 있는 메소드, 타입, 변수 등에 접근해야 할 경우가 있..

    2022.06.02
  • [Spring] 예제로 알아보는 [ 전략 패턴 ]

    이전 포스팅에서 템플릿 메서드 패턴을 알아봤고, 템플릿 메서드 패턴의 상속이라는 한계를 해결하기 위해 전략 패턴을 활용하기로 했다. 전략 패턴 템플릿 패턴은 부모 클래스에 변하지 않는 템플릿을 두고, 변하는 부분을 자식 클래스에서 상속하여 문제를 해결했다. 전략 패턴은 변하지 않는 부분을 Context 라는 개념에 두고, 변하는 부분은 Strategy 라는 인터페이스를 만들어 구현해 문제를 해결한다. 즉 상속이 아니라 위임 / 구현으로 문제를 해결하는 것이다. 전략패턴에서 Context 는 무엇일까? 바로 템플릿 메서드 패턴의 템플릿에 해당되는 개념으로, 여기서는 문맥 정도로 이해하면 된다. 개별 비즈니스 로직은 변할 수 있지만, 그걸 구현해야하는 전체적인 문맥은 잘 변하지 않기 때문에, 변하지 않는 로..

    2022.05.31
  • [Spring] 예제로 알아보는 [ 템플릿 메서드 패턴 ]

    템플릿 메서드 패턴 - 사전적 정의 / 목적 "작업에서 알고리즘의 골격을 정의하고, 일부 단계를 하위 클래스로 연기한다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도, 알고리즘의 특정 단계를 재정의할 수 있다. [GOF] " 이게 무슨 소리인가~ 알아보기 위해 스프링 예제 코드로 템플릿 메서드 패턴을 알아보겠다. 중복되는 로직의 반복 아래 코드는 컨트롤러의 request 메서드에 trace 라는 로그를 삽입한 코드다. 핵심 로직은 orderService.orderItem(itemId) 와 return "ok" 부분이 전부인데, 로그 트래킹을 하면서 부가적인 try ~ catch 구문이 붙어 코드가 비교적 지저분해 보인다. @RestController @RequiredArgsC..

    2022.05.31
  • [Spring] 스레드 로컬, ThreadLocal

    스레드 로컬 여러개의 스레드가 존재할 때, 해당 스레드만 접근할 수 있는 특별한 저장소를 의미한다. 더 풀어서 이야기 해보자. 만약 서로 다른 두 스레드가 하나의 변수에 접근한다고 할 때, 이 변수는 공유 자원으로 동시성 문제가 발생할 가능성이 다분하다. ThreadLocal 클래스는 오직 한 스레드에 의해 읽고/쓰여질 수 있는 변수를 생성한다. 가령 Thread A 가 ThreadLocal 변수( tLocal ) 에 접근하여 a 라는 문자를 저장한다고 하자. 동시에 Thread B 에서 마찬가지로 tLocal 변수에 접근하여, b 라는 문자값을 저장한다고 하면 어떻게 될까? a 라는 문자를 b 가 덮어 버리는 것이 아니라, 아래 처럼 각 스레드별 전용 저장소에 각각의 값이 저장된다. 즉 멀티 스레드 환..

    2022.05.31
  • 최근 파이썬 PS 하면서 배운 것

    dict 의 fromkeys() 메서드 - 딕셔너리 생성 시, 이미 key 값이 정해진 경우 편리하게 딕셔너리를 생성할 수 있다. - seq : 딕셔너리의 key 값이 될 iterable 로, 즉 dictionary 의 key 목록이다. - value : seq 의 각 key 에 할당될 value (값) 의미 # 정의 @staticmethod # known case def fromkeys(*args, **kwargs): # real signature unknown """ Create a new dictionary with keys from iterable and values set to value. """ pass # 사용법 value = 0 seq = [1, 2, 3] dictionary = dict...

    2022.05.05
  • 로컬의 JVM 이 여러 개일 때 발생한 문제 및 해결 (feat. gradle build 에러)

    에러 메시지 >>> Could not find tools.jar. Please check that /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home contains a valid JDK installation. 너무 너무 너무 너무 오래 걸린 에러 였다. 자바 환경변수도 다시 고치고 jvm 도 새로 깔아봤는데, 결과적으로 해결방법은 위 에러메시지의 JVM 을 삭제하는 것이다. 상황 ./gradlew build 혹은 ./gradlew clean build 시 발생한 에러였다. $ ./gradlew clean build JAVA_HOME 환경변수에 매칭된 JDK 목록을 확인해본다. $ /usr/libexec/java_home -V | grep..

    2022.04.25
  • [Java] split(".") 이 안되는 이유

    String[] splitted = "ABC.DEFU".split("."); // 예상 [ABC, DEFU] // 실제 [] suspicious regex expression "." in call to split() 이라는 경고 메시지가 뜬다. 직역하면 "의심스러운 정규 표현식" 이란 말인데, 정규 표현식 자리에 들어간 "." 이 의미가 개발자의 의도와 다르기 때문이다. 정규 표현식에서 comma (.) 는 임의의 문자열을 의미한다. 정규식에서는 특수문자를 대괄호 [] 로 감싸거나, \\ 를 앞에 붙여주어야만 한다. // wrong String[] splitted = "ABC.DEFU".split("."); // right String[] splitted = "ABC.DEFU".split("\\."); ..

    2022.04.18
  • [JUnit5] java.lang.IllegalStateException: Failed to load ApplicationContext

    오류 상황 : 기존엔 잘 진행되던 JUnit5 테스트코드가 어느순간 동작하지 않았다. 에러 메시지 : java.lang.IllegalStateException: Failed to load ApplicationContext 구글링으로 여러 해결 방법을 찾아봤을 때 1. 테스트 클래스에 @WebAppConfiguration 어노테이션 추가. -> 실패 , 여전히 같은 에러메시지가 나왔다. -> @WebAppConfiguration 해당 어노테이션은 JUnit4 를 사용할 때 적용할 수 있는 해결책이라고 한다. 2. Main Application 을 실행해보자. -> 이 부분이 해결의 실마리를 줬는데, 테스트 코드만 깨지는 줄 알았더니 애초에 main application 실행조차 되지 않고 있었다. -> 내..

    2022.04.08
1 ··· 3 4 5 6 7 8 9 ··· 11
Github LinkedIn
© Huge Hoo

티스토리툴바