일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- object
- 기업분석
- 다형성
- 알고리즘
- 주린이
- 주식
- 인플레이션
- StringBuffer
- 현금흐름표
- S&P500
- javascript
- 객체지향
- 금리인하
- 그리디 알고리즘
- 금리인상
- 프로그래머스
- 자바
- 무디스
- Java
- XLF
- 접근제어자
- 제태크
- 미국주식
- 배당성장
- mco
- etf
- 백준
- 잉여현금흐름
- 오버라이딩
- FCF
- Today
- Total
목록분류 전체보기 (209)
오늘의하루
문제 발견레거시 프로젝트의 유지 보수를 맡게 되면서 모든 화면에서 로딩 시 약 170개의 쿼리가 실행되며 그중 약 60~70개의 변하지 않는 데이터를 반환하는 쿼리가 실행되고 있는 것을 확인했습니다.이로 인해 화면 로딩 시간이 길어지는 문제을 발견해서 처음에는 Redis를 도입하여 성능을 개선하려고 했으나 서버 확장이 불가능하다는 결론이 내려졌습니다.그래서 AOP를 이용한 인메모리 캐싱을 도입하기로 했고 메서드명과 매개변수를 조합하여 키를 생성하고 그에 따른 결과를 캐싱하는 방식으로 구현할 예정입니다.이 과정에서 동시성 문제를 해결해야 했고 synchronized, ReentrantLock, ReentrantReadWriteLock과 같은 다양한 동기화 방법에 대해 깊이 알아보았습니다.1. Synchro..
1) 문제발견프로젝트에서 각 화면 별 Controller가 JSP를 호출할 때, Model에 로직 수행 후 결과를 담으며 다른 Controller에서는 매개변수가 있을때 그 매개변수에 세팅을 해줘야 하는 구조로 설계되었습니다. 총 100개 이상의 화면이 존재하는 상황에서 프로젝트 완료 시점에 Controller의 매개변수가 수정되는 문제가 발생했습니다. 이로 인해 각 Controller에서 매개변수를 개별적으로 수정해야 하는 비효율이 생겼고 이는 코드의 일관성과 유지 보수에 큰 부담이 되었습니다.2) 해결이 문제를 해결하기 위해 AOP(Aspect-Oriented Programming)를 도입했습니다. AOP를 통해 매개변수 관리 로직을 중앙 집중화하여 코드의 가독성과 유지 보수성을 극대화했습니다. 구체..
프로젝트 중 각 화면에 개별적으로 구현된 공통 기능들을 Footer와 같은 방식으로 항상 화면에 표시되도록 통합하고 디자인팀과 협력해 시각적인 디자인을 다듬어서 사용자 경험을 개선했으며 이를 통해 유지 보수성을 향상시켰습니다.1) 배경프로젝트에서 여러 화면에 공통된 기능이 있었으나 이를 개별적으로 구현한 방식은 사용자 편의성과 유지보수성에서 부족함이 있었습니다.이 문제에 대해 회의를 통해 공통 기능을 하나의 인터페이스로 통합하고 사용자에게 언제든지 접근할 수 있는 형태로 구현하도록 하였으며 해당 작업을 담당하게 되었습니다.2) 해결 방법 도출먼저 네이버의 오른쪽 하단에 위치한 스크롤 버튼 및 설정 버튼에서 영감을 얻어 공통 기능을 한 곳에 모아 사용자 편의성을 높이고자 했습니다.처음에는 버튼을 일렬로 배..
1) 문제 발견회사에서 사용 중인 AUIGrid라는 외부 라이브러리를 분석하던 중 사용자 입력을 바탕으로 그리드를 생성하는 과정에서 XSS(Cross-Site Scripting) 취약점이 존재함을 확인했습니다.AUIGrid는 사용자 입력을 직접 HTML에 삽입하는 InnerHTML 방식을 사용하는데 이는 악의적인 스크립트가 웹 페이지에 주입될 수 있기 때문에 시스템 보안에 심각한 위협이 될 수 있습니다.2) 문제 정의XSS 공격은 공격자가 웹 페이지에 악성 스크립트를 삽입하여 웹 애플리케이션의 정상적인 동작을 방해하거나 사용자의 민감한 정보를 탈취하는 공격 기법입니다.AUIGrid의 경우 사용자가 입력한 데이터가 필터링 없이 HTML에 직접 반영되기 때문에 공격자가 악의적인 스크립트를 입력하여 웹 페이지..
Spring Cloud Gateway에서 API Gateway 필터 구성하기사용자 정의 필터를 생성하려면 AbstractGatewayFilterFactory를 상속 받은 후 apply 메서드를 구현한다.GatewayFilter를 반환해야 하며 GatewayFilter를 구현한 OrderedGatewayFilter로 생성하면 실행 순서를 지정할 수 있다.OrderedGatewayFilter는 Ordered도 구현하고 있는데 Ordered 객체 안에는 HIGHEST_PRECEDENCE (Integer.MIN_VALUE)와 LOWEST_PRECEDENCE(Integer.MAX_VALUE)가 있어서 가장 먼저 실행되야 하는것과 가장 마지막에 실행되어야 한는 필터의 순서를 쉽게 지정해줄 수 있다.추가 ) Filt..
서버 포트 번호 설정: server.port = 0Spring Boot에서 server.port=0으로 설정하면, 서버는 자동으로 사용 가능한 랜덤 Port 번호를 할당한다.이는 Spring Cloud에서 특히 유용하며 여러 애플리케이션 인스턴스를 각기 다른 Port로 실행해 Eureka와 같은 서비스 등록 서버에 유연하게 등록할 수 있다.Eureka 연동 시 랜덤 Port 번호 문제점Eureka는 기본적으로 Host 이름과 Port 번호를 결합하여 인스턴스를 등록하는데 포트가 0으로 설정하면 포트번호가 0번으로 등록되어서 같은 Host 이름을 가지게 되면 몇 개를 등록해도 1개만 등록된 것처럼 보이는 문제점이 있다.이를 해결하기 위해 고유한 인스턴스 ID 설정이 필요하다. [Eureka Client 설..
Proxy 내부 호출@Component@Slf4jpublic class A { public void external() { log.info("external"); internal(); } public void internal() { log.info("internal"); }}---@Aspect@Slf4jpublic class AllAspect { @Before("execution(* *(..))") public void doA(JoinPoint joinPoint) { log.info("aop = {}", joinPoint.getSignature()); }}위 상황에서 external()을 호출하면 doA 메서드에서 작..
Java에서 기본적으로 제공하는 ThreadLocal은 동시성 문제를 해결하는 가장 기본적인 방법 중 하나입니다.ThreadLocal은 내부적으로 Map 자료 구조를 통해 각 Thread 별로 데이터를 저장하고 불러오기 때문에 각 Thread는 자신만의 데이터를 독립적으로 가질 수 있습니다.Thread와 ThreadPoolThread는 하나의 프로세스 내에서 실행 단위를 뜻합니다.Spring을 통해 웹 개발을 할 때 일반적으로 ThreadPool을 통해 Thread를 관리합니다.이러한 상황에서 ThreadLocal을 사용할 경우, 몇 가지 주의해야 할 점이 있습니다.주의사항 1. ThreadPool 재사용 문제ThreadPool에서는 Thread가 응답 후 사라지는 것이 아니고 다시 ThreadPool로..
기존 방식public RoleHierarchy roleHierarchy() { RoleHierarchyImpl roleHierarchyImpl = new RoleHierarchyImpl(); roleHierarchyImpl.setHierarchy("ROLE_ADMIN > ROLE_USER"); return roleHierarchyImpl;}변경 방식public RoleHierarchy roleHierarchy() { return RoleHierarchyImpl.fromHierarchy("ROLE_ADMIN > ROLE_USER");}변경 사항기본 생성자 사용 중단기존의 기본 생성자 생성자 RoleHierarchyImpl()은 사용하지 않게 되었습니다.팩토리 메소드인 fromHierarchy()을 통해 객..
CPU - Bound 작업CPU-Bound 작업은 CPU 연산 능력이 성능에 영향을 주는 작업입니다.이런 작업은 병렬 처리를 통해 성능을 향상시킬 수 있습니다.이유는 각 Thread는 독립적으로 CPU 자원을 사용하여 작업을 처리하기 때문입니다. 하지만 실제 CPU 코어 수를 초과하는 Thread 개수를 사용하는 경우 성능에 악영향을 초래할 수 있습니다.I/O - Bound 작업I/O-Bound 작업은 입출력 연산 능력이 성능에 영향을 주는 작업입니다.이런 작업은 디스크 or 네트워크 속도에 의해 결정되기 때문에 Thread 수를 증가해도 성능 향상이 제한적입니다.또한 각 스레드가 I/O가 작업이 완료될 때까지 대기하는 병목현상이 발생하여 Thread 관리 오버헤드가 발생할 수 있습니다.성능 향상을 위해..