일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백준
- 다형성
- 미국주식
- Java
- 객체지향
- 잉여현금흐름
- StringBuffer
- 금리인상
- 기업분석
- 주식
- 오버라이딩
- 자바
- 현금흐름표
- 금리인하
- 접근제어자
- 제태크
- 알고리즘
- 무디스
- 그리디 알고리즘
- 인플레이션
- 배당성장
- 주린이
- XLF
- etf
- javascript
- mco
- object
- S&P500
- 프로그래머스
- FCF
- Today
- Total
목록분류 전체보기 (228)
오늘의하루
Spring의 @ControllerAdvice는 애플리케이션 전역에서 발생하는 예외를 처리하는 강력한 도구이며 특정 컨트롤러나 패키지에 국한되지 않고 다양한 방식으로 활용할 수 있습니다. 자사 API 코드를 분석하던 중 Custom @ControllerAdvice에 MissingServletRequestParameterException 예외를 처리하도록 정의되어 있는 것을 확인했습니다. 하지만 이 예외는 Custom @ControllerAdvice에서 절대 처리되지 않는다는 사실을 알고 있었기 때문에 이를 Global @ControllerAdvice에서 정의해야 한다는 의견을 제안했습니다. 이 기회에 Custom @ControllerAdvice가 왜 MissingServletRequestParameter..
JPA를 사용하면서 deleteByCouponId(Long couponId)와 같은 네이밍 메서드를 활용하면 간편하게 특정 ID를 기반으로 데이터를 삭제할 수 있지만 이러한 메서드를 사용할 때 몇 가지 주의해야 할 점이 있습니다.deleteByCouponId의 동작 방식JPA에서 deleteByCouponId와 같은 메서드를 실행하면 내부적으로 다음과 같은 과정을 거칩니다.먼저 couponId를 기반으로 해당하는 엔티티 목록을 조회합니다.조회된 엔티티들을 하나씩 순회하면서 EntityManager의 remove 메서드를 호출하여 삭제합니다.삭제된 엔티티는 1개씩 flush 되며 트랜잭션이 걸려 있다면 커밋 시 최종 반영됩니다.이 과정에서 단순히 deleteByCouponId를 호출하면 SQL의 DELET..
개발자로 일하다 보면 코드를 작성하고 API를 설계하는 것만큼이나 문서화하는 과정이 중요하다는 걸 깨닫게 되는데 문서화는 단순히 기록하는 것이 아니라 팀원이나 다른 개발자와의 소통을 원활하게 하는 핵심 도구로 작용합니다.그러나 문서를 작성하는 과정에서 실수가 발생할 수 있으며 이를 제대로 검증하지 않으면 작은 오류가 큰 오해로 이어질 수 있기 때문에 이 글에서는 두 가지 문서화 방식을 비교하며 검증 과정이 왜 필요한지 살펴보겠습니다.1. 검증 없이 기록만 남기는 문서화아래는 검증 없이 API의 요청과 응답 형식만을 문서화한 코드입니다.public RestDocumentationResultHandler getTest() { return document("test", requestParam..
Java에서 날짜와 시간을 포맷하거나 파싱 할 때 흔히 사용하는 SimpleDateFormat은 편리하지만 멀티스레드 환경에서 공유 자원으로 사용할 경우 동시성 문제를 일으킬 수 있습니다.이는 SimpleDateFormat이 Non-Thread-Safe로 설계되었기 때문인데 현재 회사 레거시 프로젝트에서 SimpleDateFormat을 공유 자원으로 사용하고 있는 코드를 발견했는데 이 문제를 해결하기 위해 동시성 문제의 원인을 분석하고 수정이 필요한 이유와 대안을 정리해 보았습니다.동시성 문제 발생 원인SimpleDateFormat의 동시성 문제는 주로 내부적으로 공유되는 Calendar 객체와 pattern 문자열의 상태 변경에서 비롯되는데 이 클래스는 날짜를 포맷하거나 파싱 할 때 Calendar 객..
홈서버를 만들기 위해 오래된 구형 노트북의 윈도우를 밀고 ubuntu를 설치하였습니다.이제 SSH 설치를 위해 WI-FI를 연결하도록 하겠습니다.1. Wi-Fi 인터페이스 확인 하기먼저 시스템에 어떤 네트워크 인터페이스가 있는지 확인해야 합니다.ip a 명령어를 사용하면 시스템에 연결된 네트워크 인터페이스 목록을 확인할 수 있습니다. $ ip a1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forev..
MySQL의 쿼리 성능을 최적화하기 위해서는 실행 계획을 분석해야 하는데 특히 실행 계획의 type 컬럼은 MySQL이 쿼리를 처리하는 방식 즉 데이터에 접근하는 방법을 보여줍니다.이 정보를 활용하면 성능을 최적화할 수 있는 중요한 힌트를 얻을 수 있기 때문에 성능 최적화 첫 단계로 이번 글에서는 type 컬럼에 표시될 수 있는 12가지 값 중 5개의 대표 type을 소개하고 각 값이 성능에 미치는 영향을 분석해 보겠습니다.1. constconst는 가장 효율적인 검색 방법으로 MySQL이 테이블에서 단일 행을 조회하는 경우입니다.Unique 속성을 가진 Index일 경우에만 가능합니다.CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(10..
최근 MySQL을 공부하면서 선착순 쿠폰 발급을 효율적으로 처리하는 로직을 고민해보았습니다.이 글에서는 MySQL 8.0의 고급 기능을 활용하여 동시성 제어와 쿠폰 발급 로직을 구현하는 방법을 정리해 보겠습니다.MySQL 8.0 고급 기능MySQL에서 SELECT ~ FOR UPDATE를 사용하면 다른 트랜잭션에서 읽기나 쓰기를 시도할 경우 해당 행이 잠금이 해제될 때까지 대기하게 되는데 MySQL 8.0에서는 이를 보완하고 동시성을 효율적으로 처리하기 위해 다음과 같은 기능이 추가되었습니다.1. NO WAIT해당 기능은 잠금된 행을 만나면 대기하지 않고 즉시 예외(Lock wait timeout exceeded)를 던집니다.2. SKIP LOCKED해당 기능은 잠금되지 않은 행만을 대상으로 작업을 수행..
Go 언어에서 값 타입은 복사할 때 깊은 복사가 이루어지며 참조 타입은 얕은 복사가 이루어집니다.1. 값 타입 (Value Type)값 타입은 변수에 할당될 때 값 자체가 복사(깊은 복사)됩니다.Go에서 기본적으로 제공하는 값 타입으로는 int, float, struct 등이 있습니다.package mainimport "fmt"type Jang struct { X, Y int}func (j *Jang) Jangto(i int) { j.X = j.X * i j.Y = j.Y * i}func JangTest() { originV := Jang{1, 2} copyV := originV // 깊은 복사 copyV.Jangto(2) fmt.Println("origin..
공부를 하다 보면 "Java의 컨텍스트 스위칭 비용이 비싸다"라는 말을 자주 듣곤 하는데 이번 글에서는 왜 Java의 컨텍스트 스위칭 비용이 비싼지 정리해보았습니다.JAVA의 Thread 구조Java에서는 java.lang.Thread를 통해 스레드를 생성하게 되는데 이 과정에서 JVM은 플랫폼 스레드를 만들고 이를 OS 스레드와 연결되고 이 OS 스레드는 다시 커널 스레드와 연결됩니다. 즉, Java에서는 스레드가 JVM 플랫폼 스레드 → OS 스레드 → 커널 스레드의 1:1:1 관계로 동작합니다.- JVM 스레드 : 크기가 작음- OS 스레드 : JVM 스레드에 비해 훨씬 큼Context Switching컨텍스트 스위칭은 실행 중인 스레드를 변경할 때 현재 스레드의 상태(레지스터, 스택 포인터, 메모..
최근 Go 언어에 대한 흥미가 생겨 간단한 API 서버를 Go로 만들고 이를 Spring Eureka에 등록해보자는 생각이 들어서 이에 대한 방법을 작성했습니다.1. 필요한 PackageGo에서 사용할 패키지는 Gin과 eureka-client이며 설치하려면 Go 모듈을 사용하여 필요한 의존성들을 추가해야 합니다.go get github.com/gin-gonic/gingo get github.com/xuanbo/eureka-client2. Go 구현 코드package mainimport ( "fmt" "log" "net" "vaultis-go-module/module/decryption" "github.com/gin-gonic/gin" eureka "github.com/x..