분류 전체보기
1/21 개발일기 (clustered index, non-clusted index)
1/21 개발일기 (clustered index, non-clusted index)
2024.01.21non - clustered index 음... 어제는 clustered index에 대해서 봤는데 인덱스 키 값에 따라 배열하는것으로 물리적인 데이터 값을 정렬하는것으로 이해하고 넘어갔다. 오늘은 non - clustered index에 대해 보자. 이 내용은 테이블의 물리적 정렬 순서와는 별도의 구조를 갖는다. clustered index 처럼 인덱스 키값에 따라 정렬되지만, 테이블의 실제 데이터는 그 순서에 영향을 받지 않는다. 정렬된 인덱스 키에 대한 쿼리가 수행할 때 non - clustered index는 정렬된 키와 각 키에 해당하는 데이터 행의 위치에 가리키는 포인터를 이용해 결과를 찾아간다. non - clustered index 의 구조에 대해 살펴보자. 좋은 참고 지표가 있어서 가..
1/20 개발일기(thread-poo, resource관리, clustered index)
1/20 개발일기(thread-poo, resource관리, clustered index)
2024.01.20오늘 주말이여서 그간 못했던 내용들을 정리해보고자 한다. 사실 이전에 해야할것도 좀 밀려있는데 우선순위 높은것으로 추려냈다. 그래도 개발 일기 쓰자고 마음먹었는데 90일은 가야할거 같은 기분이다.. 스프링 큐 (스레드 대기풀) Thread Pool을 사용하면 Spring 내부에서 Queue 를 사용하는데 이거 어떻게 구현되어있는지 궁금해졌다. 한번 정리를 해볼 시간.. java.util.concurrnet.Executors 패키지는 스레드 풀과 관련된 유틸리티 메소드를 제공하고 이 클래스는 다양한 종류의 스레드 풀을 생성하고 관리하기 위한 편리한 방법을 제공하는 정적 메소드들로 구성되어 있다. 예를 들어 이 패키지를 뜯어보면 newFixedThreadPool은 고정된 수의 스레드를 가진 스레드 풀을 생성..
1/16 개발일기(이벤트처리, annotation 동작원리)
1/16 개발일기(이벤트처리, annotation 동작원리)
2024.01.16오늘 공부는 갑자기 Event 에 꽂혀서 보고 있다. 게임 이벤트 같지만... 사실은 이벤트 드리븐 아키텍처이다. 이벤트 드리븐 아키텍처는 왜 필요할까? 데이터 동기화가 필요한 시점이 있을것이다. 데이터 일관성을 맞춰야 할수도 있으니까? 원자성도 고려해야한다. 그럼 간단하게 생각해볼건 API Call을 이용해서 동기화 시키는건데 이건 좀 위험하다. 하나가 죽으면 이걸 참조하는 다른 서비스도 같이 죽어버릴 수 있다. 그러면 중간에 뭐 하나 두는게 가장 이상적일거 같다. kafka 같은... 사실은... https://www.youtube.com/watch?v=BnS6343GTkY 오늘은 이걸 좀 보고 리뷰를 해보고자 한다. kafka 구조를 보면 producer, consumer 구조라는것을 쉽게 파악할 ..
스프링 핵심원리 고급편 - threadLocal, 템플릿 메서드 패턴 & 콜백 패턴
스프링 핵심원리 고급편 - threadLocal, 템플릿 메서드 패턴 & 콜백 패턴
2024.01.14강의 하나를 완강해야 겠다고 생각이 들었는데 빠르게 보고 싶은 강의가 생겼다. 강의 들으면서 정리도 겸하고 싶어 주저리 주저리 이 페이지에 옮겨놓으려고 한다. 조금 길어지면 2편으로 .. 로그 추적기 프로젝트에 병목이 생긴다면 로그를 통해 확인해봐야 한다. 아래 요구사항으로 로그를 개선하는 작업이다. 시간 정상호출 과 예외호출 구분 메서드 호출 깊이 구분 실제로 소스를 보면 알겠지만 로그 추적기 수정이 일어날 때마다 피처들에 대한 버전을 계속 관리해야 한다. 이 말은 로그 추적기를 달아야할 피처가 많아지면 많이질수록 그만큼 소스양이 나온다는 뜻..! 아래 구조에서는 traceId를 넘겨줘야 하는 구조여서 새 클래스를 생성할 때마다 의존관계도 계속 추가되고 그러면 응집도가 떨어지고 결합성이 높아질 수 밖에..
패션 관련 프로젝트를 진행하며 ... 1 (feat. 500 maker)
패션 관련 프로젝트를 진행하며 ... 1 (feat. 500 maker)
2024.01.14요즘 패션 열풍이 불다보니 회사에서도 관련 프로젝트 업무를 담당하게 되었다. 여기서 내가 맡은 업무는 패션 스토어 조회, 최근본상품 조회, 찜하기 상품 조회 & 저장에 대한 API 생성 및 수정이었다. 근데 이것도 레거시, 최근 프로젝트 거의 n개 프로젝트를 왔다갔다 수정하다 보니 헷갈려.. 여러 논의가 있었지만 거기서도 가장 중요하게 고려되어야 할점은 성능 문제였다. 이 페이지에서 얼만큼의 tps가 나올지 모르는 상황에서 위 API를 여러번 찌르게 되면 문제가 발생할 수 밖에 없었기 때문에 ... 그러다 500 떨어질랴... 24년이 시작된 후부터 한주간은 계속 회의를 진행한듯 싶다. 특히, 협업하는 부서가 있어서 데이터는 얼만큼 내릴건지 이런거에 대한 협의가 필요했다. 대략적인 협의가 끝난 후에는 A..
Java 버전업 (11->17) 후기 켁;
Java 버전업 (11->17) 후기 켁;
2024.01.07팀내 admin 프로젝트에 Java 버전업을 담당하였다. 비교적 다른 프로젝트에 비해 규모가 작은터라 부담은 없었지만 ... 개인적으로 타팀에서 많이 조회되는 api를 가지고 있는지라 한편으로는 장애 날때마다 dev, alp 든 봐야한다는 부담감이 있어서 조심스러웠다. 자바 버전업 얘기가 나온것은 팀에서도 소개를 하긴 했지만 아래와 같은 이유에서 도입을 하게 되었다. 자바 버전업 도입 목적 Java 17은 2021.10 공개한 LTS 버전으로 2029년 9월까지 지원을 하게 됩니다. Java 11과 비교해서 70가지 이상의 JEP 가 추가되었습니다. (*JEP - JDK 개선 제안) Java Support 기간이 길다. LTS 버전의 장점은 기업과 개발자들이 안정적인 플랫폼에서 장기적인 개발 계획을 세울..
테스트 방법
테스트 방법
2023.03.18JUnit 이란? JUnit은 자바 언어용 단위 테스트 프레임워크입니다. 단위 테스트는 개발자가 자동화된 단위 테스트를 작성하게 도와줍니다. 이를 통해서 코드 품질을 향상시킬 수 있습니다. JUnit은 코드를 리팩토링 하거나 기능을 추가하거나 할때 이전에 작성된 테스트 코드가 작동하는지 확인함으로써 코드 일관성에도 도움을 주게 됩니다. JUnit 특징 사용이 쉽습니다. 개발자가 테스트 케이스를 작성하기 용이합니다. 자동화된 테스트가 가능합니다. 코드 커버리지를 보장할 수 있습니다. 테스트 코드 재사용성이 가능합니다. JUnit은 단위 테스트이기 때문에 독립적으로 실행할 수 있습니다. 그래서 코드를 재사용하기 용이합니다. 테스트 코드 가독성 : JUnit 테스트 결과 쉽게 이해하는데 도움이 됩니다. JUn..
캐시방법
캐시방법
2023.03.11ConcurrentHashMap ConcurrentHashMap은 Thread-Safe 합니다. 동시성 작업에 최적화된 Map 클래스이고, 이 자료구조를 이용해서 캐시를 구현할 수 있습니다. 캐시에서 값을 가져오는 경우 ConcurrentHashMap 에서 해당 키를 사용하여 값을 가져올 수 있습니다. 또, 각 항목에 만료 시간 필드를 추가하여 만료 시간을 추적할 수 있습니다. 만료시간이 5분이라면 아래와 같이 코드를 작성할 수 있습니다. ConcurrentHashMap map = new ConcurrentHashMap(); long expiryTime = System.currentTimeMillis() + (5 * 60 * 1000); // 5분 후 map.put("key1", new MyObject(..
다이나믹 프록시
다이나믹 프록시
2023.03.04다이나믹 프록시란? 프록시는 타겟 코드의 수정없이 접근제어 혹은 부가기능을 추가하기 위해 주로 사용됩니다. 프록시를 사용하기 위해서 대상 클래스 수만큼 프록시 클래스를 하나하나 만들어줘야 하는것이 반복되는 코드가 들어가서 코드중복이 발생하게 됩니다. newProxyInstance() Java reflection API, newProxyInstance() 메서드 사용하는것이 런타임에서 프록시 클래스를 만들어 주기 때문에 중복으로 클래스를 만들필요가 없습니다. ClassLoader: 프록시 클래스를 생성할 클래스로더 Class: 프록시 클래스가 구현할 인터페이스 InvocationHandler: 메서드가 호출되었을 때 실행될 핸들러 @CallerSensitive public static Object newP..
Spring Boot CORS 설정하기
Spring Boot CORS 설정하기
2023.02.11CORS 란? Cross-Origin Resource Sharing, CORS 다른 출처의 자원을 공유할 수 있도록 설정하는것을 말합니다. CORS를 제대로 설정하지 않으면 원하는 리소스를 공유받지 못한다. CORS 문제를 Spring으로 해결하는 방법을 체크해본다. Configuration 해결하기 addMapping registry.addMapping 을 이용해서 CORS를 적용할 URL패턴을 정의할 수 있다. 아래처럼 "/**" 와일드 카드를 사용할 수 있다. @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { regi..
Spring Boot AOP
Spring Boot AOP
2023.02.11AOP란? AOP는 Aspect Oriented Programming 즉, 관점 지향 프로그래밍의 약어이다. 여러 클래스에 나눠져 있는 책임을 Aspect 로 캡슐화하는 접근 방식이다. AOP는 로깅, 트랜잭션, 보안, 인증, 캐싱 공통적인 로직이 요구된다. 이러한 공통의 로직을 횡단 관심사(cross-cutting concern) 라고 부른다. 공통 로직을 애플리케이션, 비즈니스, 데이터 계층에서 구현하게 되면 코드 유지관리가 어렵게 된다. AOP 주요 용어 Aspect: 흩어진 관심사를 모듈화 하는 것, 부가기능을 모듈화 한다. Target: Aspect를 적용되는 곳 Advice: 실질적으로 어떤 일을 해야하는지 적어놓은것, 부가기능을 담은 구현체다. JointPoint: Advice가 적용될 위치..
Spring Bean
Spring Bean
2023.02.04Spring Bean 이란? Spring IoC 컨테이너가 관리하는 자바 객체를 Bean 이라고 한다. 즉, Spring에 의해서 생성되고 관리되는 자바 객체라고 한다. Spring Container Spring Container를 구성하는 ApplicationContext 다형성으로 구현된다. 여기에서 ApplicationContext가 인터페이스이고 AnnotationConfigApplicationContext 구현체가 된다. 만약에, 빈에 대한 설정정보를 AppConfig.class 에 등록해두면 이 정보를 보고 객체 생성을 하게 된다. 스프링 컨테이너는 (빈 이름 | 빈 객체)로 등록된다. 이러한 동적인 의존관계를 스프링이 설정해준다. ApplicationContext applicationCont..