일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- XLF
- 접근제어자
- mco
- object
- 오버라이딩
- 기업분석
- 그리디 알고리즘
- 다형성
- 객체지향
- 백준
- 주린이
- Java
- 금리인하
- 미국주식
- S&P500
- etf
- 배당성장
- 알고리즘
- 자바
- javascript
- StringBuffer
- 주식
- 현금흐름표
- 프로그래머스
- 금리인상
- 잉여현금흐름
- 무디스
- 제태크
- 인플레이션
- FCF
- Today
- Total
목록분류 전체보기 (228)
오늘의하루
RSA 알고리즘은 공개키와 비밀키라는 두 개의 키를 사용하여 데이터를 암호화하고 복호화하는 방식입니다.이 알고리즘의 핵심은 두 개의 소수를 사용하여 공개키와 비밀키를 생성하고 이를 통해 안전하게 정보를 전달하는 것입니다.공개키 : 공개키는 공유되며 암호화에 사용됩니다.비밀키 : 공유되면 안되며 암호화된 데이터를 복호화하는 데 사용됩니다.RSA 알고리즘RSA 알고리즘을 구현하기 위한 몇가지 과정은 아래와 같습니다.1. 2개의 소수 선택 및 N 추출소수 P와 Q를 선택한 후 N을 계산합니다.예를 들어 P = 5, Q = 11를 선택한다면 N = P * Q = 55가 됩니다. 중요한 점은 P와 Q가 노출되면 공개키와 비밀키를 만들 수 있기 때문에 꼭 제거해야합니다.2. 오일러 피 함수( φ(N) ) 계산오일러..
Java에서는 Pattern.matches 메소드를 통해 정규표현식을 쉽게 사용할 수 있지만 내부 동작 원리를 제대로 이해하지 못하면 성능 문제가 발생할 수 있습니다. Pattern.matches의 동작 원리Pattern.matches(String regex, CharSequence input)는 아래와 같은 과정을 거쳐 입력 문자열을 매칭합니다.> 정규표현식 컴파일메소드 호출 시 입력받은 정규표현식(regex)을 NFA(비결정적 유한 오토마타, Non-deterministic Finite Automaton)에서 정규표현식에 따라 DFA(결정적 유한 오토마타, Deterministic Finite Automaton)로 변환하며 이 과정에서 정규표현식을 해석하고 효율적으로 실행될 수 있는 내부 구조를 생성..
문제점 : 깊은 상속 관계의 DTO 무리들...레거시 프로젝트에서는 각각의 DTO들이 모두 깊은 상속 관계를 갖은 채 하나씩 정의되어 있으며 해당 DTO를 사용해서 모든 행위에 대해 사용하고 있었습니다.불필요한 데이터 전송요청과 응답에 불필요한 필드들이 포함되어 있습니다.유지보수 어려움새로운 필드 추가시 모든 DTO를 검토해야 할 수 있습니다.리팩토링 방향 : 상속에서 컴포지션으로비록 정상적으로 작동하고 있지만 앞으로도 계속해서 사용될 제품이기 때문에 데이터 전송의 효율성과 유지 보수성을 개선하기 위해 리팩토링을 결정했습니다. 처음 리팩토링 관련 이야기를 했을때 "이미 동작하는 프로젝트를 굳이 수정할 필요가 있는가?"라는 반응이였지만 내가 생각하는 중요하다고 생각드는 점을 강조하며 설득했습니다.명확성요청..

readonly 상태라면 영속성도 readonly일까? 라는 궁금증이 들어 테스트 코드를 작성하면서 알게 된 알아둬도 정말 쓸데 없는 내용을 공유하려고 합니다. Hibernate에서 readonly 힌트를 사용하면 해당 엔티티를 조회할 때 스냅샷을 만들지 않게 됩니다.이로 인해 더티 체킹이 발생하지 않으며 결국 수정 쿼리가 DB에 나가지 않게 됩니다.즉, readonly는 DB 쿼리 측면에서 수정할 수 없도록 만들어줍니다.그런데 readonly 상태에서도 엔티티의 필드를 수정해봤더니 수정 쿼리는 발생하지 않지만 1차 캐시에는 수정된 값이 반영되는 걸 알게 되었습니다.@Test@Transactional(readOnly = true)void queryHint() { // given Member m..
1. 벌크 연산 (Bulk Operation)이란?벌크 연산이란 N개의 데이터를 한 번에 UPDATE 또는 DELETE 하는 작업을 의미합니다.Spring Data JPA에서 벌크 연산을 수행하기 위해서는 @Modifying이 필요합니다.2. 왜 필요할까?Spring Data JPA에서는 기본적으로 Query 메서드의 반환 값을 getResultList() 또는 getSingleResult()를 통해 처리하는데 이는 SELECT에서만 사용 가능합니다.이러한 이유로 UPDATE와 DELETE는 수정 또는 삭제된 행의 개수를 반환하게 되기 때문에 반환 값을 맞추기 위해서 @Modifying이 필요한데 만약 사용하지 않는다면 아래와 같은 예외를 맞이할 수 있습니다.예외 클래스 : InvalidDataAcces..
Cascade Type 속성Cascade는 부모 객체의 상태 변화가 자식 객체에게 영향을 미칠지 여부를 설정하는 기능이며 양방향 관계에서 외래 키를 가지지 않는 객체를 부모라고 칭할 때 각 Cascade 유형의 의미는 다음과 같습니다.@Entitypublic class Team { ... @OneToMany(mapped by = "team") private List members = new ArrayList(); ...}1. PERSIST부모 객체를 저장할 때 자식 객체도 자동으로 DB에 저장할 수 있습니다.예를 들어, members.add(...)와 같이 부모 객체에 자식 객체를 추가한 후 Team 객체를 저장하면 Member 객체도 함께 저장됩니다.주의 사항: 자식 테이블에서 부..
API를 설계하다 보면 서로 다른 요청 데이터 타입에 공통 필드가 반복적으로 존재하는 경우가 많습니다.이 상황에서 새로운 공통 필드가 추가되거나 변경될 때 모든(1억개) DTO를 수정해야 하는 번거로움이 발생합니다. DTO(Data Transfer Object)를 쓰는 이유?"Controller에서는 DTO로 요청 정보를 받는 게 좋다."라는 말을 개발 공부를 시작했을 무렵 접하게 되었습니다.하지만 이유를 정확히 알지 못한 상태에서 사용해 오다가 이번에 JPA 공부를 하면서 그jangto.tistory.com1. 문제사항처음 API를 설계할 때 공통 내용을 요청받는 DTO를 각각 따로 만들었다고 가정합니다.예를 들어 BookRequest, AlbumRequest, MovieRequest라는 요청 DTO가..
"Controller에서는 DTO로 요청 정보를 받는 게 좋다."라는 말을 개발 공부를 시작했을 무렵 접하게 되었습니다.하지만 이유를 정확히 알지 못한 상태에서 사용해 오다가 이번에 JPA 공부를 하면서 그 의미를 더 깊이 이해하게 되었습니다. 해당 글에서는 Entity 대신 DTO를 사용해야 하는 이유를 정리했습니다.Entity와 DTO란 무엇일까?JPA와 같은 ORM(Object Relational Mapping) 기술을 사용할 때 Entity란 DB 테이블과 1:1로 매핑되는 클래스를 의미하며 각 필드는 테이블의 컬럼과 연결되어 애플리케이션에서 DB와 상호작용하는 도메인 모델의 역할을 합니다.DTO(Data Transfer Object)는 데이터 전송을 위한 전용 객체로써 주로 API 요청과 응답 ..
BeanPostProcessor는 Spring에서 빈이 등록되기 전 빈을 조작할 수 있는 강력한 기능입니다.빈 초기화 과정에서 BeanPostProcessor의 역할을 알아보고 @PostConstruct와의 실행 순서 차이에 따른 충돌 가능성을 알아보겠습니다.Bean이 등록되는 과정Spring Container가 빈을 등록할 때 간단하게 아래와 같은 순서로 진행됩니다.빈 정의 등록 - 빈 메타데이터를 등록합니다.빈 인스턴스 생성 - 빈 객체를 생성합니다. 의존성 주입 - 의존성을 주입합니다.빈 초기화 - 초기화 메소드를 호출합니다. 빈 등록 - 컨테이너에 등록합니다.BeanPostProcessor를 사용하면 빈 초기화 전후 단계에서 빈을 조작할 수 있습니다.※ BeanPostProcessor는 가장 우선..
문제 발견레거시 프로젝트의 유지 보수를 맡게 되면서 모든 화면에서 로딩 시 약 170개의 쿼리가 실행되며 그중 약 60~70개의 변하지 않는 데이터를 반환하는 쿼리가 실행되고 있는 것을 확인했습니다.이로 인해 화면 로딩 시간이 길어지는 문제을 발견해서 처음에는 Redis를 도입하여 성능을 개선하려고 했으나 서버 확장이 불가능하다는 결론이 내려졌습니다.그래서 AOP를 이용한 인메모리 캐싱을 도입하기로 했고 메서드명과 매개변수를 조합하여 키를 생성하고 그에 따른 결과를 캐싱하는 방식으로 구현할 예정입니다.이 과정에서 동시성 문제를 해결해야 했고 synchronized, ReentrantLock, ReentrantReadWriteLock과 같은 다양한 동기화 방법에 대해 깊이 알아보았습니다.1. Synchro..