일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 99클럽
- jwt
- 개발자부트캠프추천
- DesignPattern
- JavaScript
- Python
- TiL
- 항해99
- infcon 2024
- Spring multimodule
- 빈 충돌
- 1주일회고
- 단기개발자코스
- 파이썬
- KPT회고
- 커스텀 헤더
- jwttoken
- 프로그래머스 이중우선순위큐
- spring batch 5.0
- @FeignClient
- 구글 OAuth login
- 디자인 패턴
- 취업리부트코스
- 코딩테스트 준비
- 인프콘 2024
- 디자인패턴
- 개발자 취업
- 빈 조회 2개 이상
- 프로그래머스
- 전략패턴 #StrategyPattern #디자인패턴
- Today
- Total
목록Toy Projects/Ditto - Discuss Today's Topic (17)
m1ndy5's coding blog
docker-compose?docker-compose는 단일 서버에서 여러개의 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리 도구왜 docker-compose를 사용할까?여러 개의 컨테이너가 하나의 애플리케이션으로 동작할 때 docker-compose를 사용하지 않는다면 각 컨테이너를 하나씩 생성해 실행해야 한다. 만약 100개의 컨테이너가 하나의 애플리케이션으로 동작한다면 일일이 컨테이너를 실행하기는 번거롭다.docker-compose는 여러 개의 컨테이너의 옵션과 환경을 정의한 파일을 읽어 컨테이너를 순차적으로 생성하는 방식으로 동작하기 때문에 하나의 명령어로도 애플리케이션을 이루고 있는 컨테이너들을 실행시킬 수 있다.docker-compos..
파면 팔수록 굉장히 많은 것들이 나오는 동시성..!! 재밌구나 하하 이번에는 Java에서 동시성 이슈를 제어하는 방법에 대해 정리해보자. 1. Synchronized 키워드 : Synchronized 키워드를 사용하여 특정 메서드 또는 코드 블록을 한 번에 하나의 스레드만 실행하도록 한다. public class SynchronizedExample { private int counter = 0; // synchronized 키워드를 사용하여 메서드를 동기화 public synchronized void increment() { counter++; } public int getCounter() { return counter; } public static void main(String[] args) { Syn..
모의면접을 봤는데 생각하지 못했던 부분에서 질문이 들어왔다. 이전 포스팅에서 낙관적 락을 사용해 동시성 문제를 해결할 때 Version을 사용해 엔티티의 수정을 막았다고 했는데 이 Version이 데이터베이스에 저장되서 관리되는 것이냐는 질문에 대답을 하지 못했다. 또한 Select for Update로도 충분히 동시성 이슈를 해결할 수 있는데 왜 굳이 Version을 사용해서 진행하였냐라는 질문에도 제대로 대답하지 못했다. 그래서 정리해보려고 한다! Post Entity @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Post extends BaseEntity { @Column(name="member_id",..
"Docker is a must" said job posting. 어느새 개발자 사이에서 필수가 되버린 Docker 대체 넌 누구냐?? 알아가보자. What is Docker? Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다. Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것들이 포함되어 있다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있다. 도커 이미지 & 컨테이너 도커 이미지는 컨테이너를 만드는 데 사용되는 읽기 전용 템플릿이다. 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 도커..
코스피와 코스닥 종목을 가져오면서 해당 종목의 개수가 거의 4000개에 가까웠고 각 종목의 10일치 데이터만 가져온다고 해도 거의 40000개의 쿼리가 날라가야하는 상황이었다. JPA saveAll()를 사용해도 bulk insert 는 되지 않았기 때문에 jdbcTemplate의 batchUpdate를 사용하여 bulk insert를 처리하였다. 일단 나는 Mysql 8.0을 사용하고 있기 때문에 DATABASE_URL=jdbc:mysql://{rds 주소}/ditto?&rewriteBatchedStatements=true 이렇게 스키마 뒤에 &rewriteBatchedStatements=true 를 붙여주었다. JPA saveAll()과 JdbcTemplateBatchUpdate() 성능 비교 Bat..
프로젝트에서 N+1의 문제가 어디서 날까~ 하고 찾아봤더니 한 군데서도 발생하지 않았다...ㅋㅋㅋㅋㅋㅋ 이미 모듈도 잘게 쪼개놨고 외래키가 그닥 많이 쓰이고 있지 않았기 때문에 오히려 외래키를 없애야겠다는 생각이 들었다. 그래도 N+1 문제에 대해 공부했으니 N+1 문제의 해결법과 외래키에 대해서 정리하는 시간을 가져보려고 한다! 1. Lazy Loading과 Fetch Join을 사용해 쿼리 작성 Lazy Loading은 필요할 때만 연관된 데이터를 가져오는 전략이고 Fetch Join은 특정 연관된 데이터를 즉시 로딩하는 방법이다. 이를 조합하여 효과적으로 N+1 문제를 해결할 수 있다. @Entity public class Post { // ... 다른 필드들 @OneToMany(mappedBy =..
엔티티를 작성하면서 Fk로 가져오는 컬럼을 @ManyToOne을 사용해 작성했고 굳이 FetchType은 명시하지 않았다. 후에 팀원에게 코드리뷰를 받으면서 FetchType은 Lazy로 설정하는 것이 좋다라는 피드백을 받게 되었고 그 이유를 정리해 보려고 한다! 즉시 로딩 & 지연 로딩 JPA에서 엔티티 간의 관계를 매핑할 때 지연로딩과 즉시로딩 이 두 가지 전략을 사용해서 불러올 수 있는데 두 전략의 차이는 데이터베이스에서 연관된 엔티티를 언제 로딩하는지다. 지연로딩(Lazy Loading) 연관된 엔티티를 실제로 사용할 때까지 로딩을 미루는 전략 연관된 엔티티를 가져오는 것이 필요한 순간에만 로딩을 수행한다. 모든 연관된 엔티티를 미리 로딩하지 않기 때문에, 필요한 경우에만 데이터를 가져와서 성능을..
Lock이란 Lock은 다 찾아보게 만든 동시성 이슈 해결이 완료됐다...ㅋㅋㅋㅋㅋㅋ 오히려 좋아 이해가 잘됐어(?)ㅋㅋㅋㅋㅋㅋ 동시성 이슈 해결을 위한 긴 여정 레츠고. 먼저 나의 엔티티들을 소개하겠다! package org.example.domain; import jakarta.persistence.Version; import org.example.global.entity.BaseEntity; import org.example.global.entity.UsageStatus; import jakarta.persistence.Column; import jakarta.persistence.Entity; import lombok.*; import org.hibernate.annotations.ColumnDe..
프로젝트를 진행하면서 아주 중요한 문제 중에 하나인 동시성 문제가 발생하는 것을 깨달았다. 일단 내 프로젝트에서는 좋아요를 누르는 부분이나 조회수에서 동시성 문제가 발생하는데 사실은 동시성 이슈가 생겨도 크게 상관없는 부분들이긴 했으나 만약 개발하는 기능이 잔고 차감과 같은 동시성에 아주 민감한 기능일 수도 있기 때문에 동시성 문제를 해결해보려고 한다! 트랜잭션이란? @Transactional public PostLikeResponse pushPostLike(Long memberId, Long postId){ Post post = postRepository.findById(postId).orElseThrow(() -> { throw new NoSuchPostException(); }); if (isPos..
이전 포스팅에서는 cron을 사용하여 batch job을 실행시켰다면, 이번에는 jenkins를 사용하여 batch job을 실행시켜보려고 한다. 그렇다면 jenkins로 batch를 관리했을 때 가질 수 있는 장점이 무엇일까? Jenkins? 대표적인 CI 툴로 대부분의 경우 배포 용도로 사용된다. * CI(Continuous Integration, 지속적 통합)이란 뜻으로 애플리케이션의 버그 수정이나 새로운 코드 변경이 주기적으로 빌드 및 테스트 되면서 공유되는 레파지토리에 통합(merge)하는 것을 의미한다. 좀 치는 백엔드 개발자라면 젠킨스에 대해서 이미 어느정도 들어봤을텐데 batch에도 젠킨스를 사용한다고? 라는 의문점이 들 수 있다. 배치를 위한 젠킨스와 서비스를 위한 젠킨스를 분리해서 사용..