일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 디자인패턴
- JavaScript
- 빈 충돌
- 개발자부트캠프추천
- 프로그래머스 이중우선순위큐
- 개발자 취업
- 코딩테스트 준비
- DesignPattern
- @FeignClient
- 항해99
- 인프콘 2024
- 전략패턴 #StrategyPattern #디자인패턴
- KPT회고
- TiL
- 99클럽
- Python
- infcon 2024
- 파이썬
- Spring multimodule
- spring batch 5.0
- 구글 OAuth login
- 디자인 패턴
- 1주일회고
- 단기개발자코스
- 프로그래머스
- 빈 조회 2개 이상
- jwt
- jwttoken
- 커스텀 헤더
- 취업리부트코스
- Today
- Total
목록분류 전체보기 (192)
m1ndy5's coding blog
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bfAe8U/btsFB8cr1Uy/k1FZmkXkZIRZuegpcQMfO0/img.png)
자바 프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라서 여러 영역으로 나누어 관리한다. JVM의 메모리 공간은 크게 Method(Static) 영역, Stack 영역, Heap 영역으로 구분되고 데이터 타입에 따라 각 영역에 나눠져 할당된다. 자바 변수의 종류 변수는 크게 네 종류로 변수의 선언된 위치에 따라 클래스 변수, 인스턴스 변수, 지역변수, 매개변수로 나뉜다. public class Main{ public static void main(String[] args){ // 매개변수 int num = 990; // 지역변수 } } public class Counter { private int state = 0; // 인스턴스 변수 public static int ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bwFR0Y/btsFxY3Fizr/zWFXgkouTMZuECy4b9riO0/img.png)
자바를 사용해 개발을 할 때 항상 JDK를 설치해야 했다. 이 JDK는 무엇이고 JVM, JRE와 어떤 차이가 있는지 알아보자! JDK(Java Development Kit) JDK는 자발 개발키드의 약자로 개발자들이 자바로 개발하는 데 사용되는 SDK(소프트웨어 개발 키트)이다. JDK 안에는 자바 개발 시 필요한 라이브러리들과 javac(자바 컴파일러로 자바 소스를 바이트 코드로 컴파일), javadoc(자바 소스로부터 HTML 형식의 API 도큐먼트 생성) 등의 개발 도구들이 포함되어 있고, 자바 프로그램을 실행도 시켜줘야하기 때문에 JRE도 함께 포함되어 있다. JRE(Java Runtime Environment) JRE는 자바 실행환경의 약자로써 JVM과 자바 프로그램을 실행(동작)시킬 때 필요..
JPA를 사용하면서 영속성 컨텍스트를 모른다?? 이건 말이 안된다!!!! 지금 알아보자~~ 영속성 컨텍스트(Persistence Context)? JPA에서 사용되는 개념 중 하나로 엔티티 인스턴스를 관리하고 데이터베이스와의 상호작용을 효율적으로 처리하기 위한 환경을 제공한다. 영속성 컨텍스트는 엔티티의 생명주기를 관리하고 쿼리 결과를 캐시하는 등의 역할을 수행한다. 영속성 컨텍스트는 여러개 존재할 수 있으며 각각의 영속성 컨텍스트는 특정 트랜잭션 범위 내에서 독립적으로 동작한다. 1. 엔티티의 생명주기 관리 - 비영속 상태 (New/Transient) 데이터베이스에 저장되지 않은 상태로, 객체를 생성한 직후의 상태이다. // 비영속 상태 Employee employee = new Employee(); ..
JPA(Java Persistence API) 자바 언어를 위한 객체-관계 매핑(ORM) 표준이다. ORM(Object Relational Mapping)? 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것 - 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용하기 때문에 객체 모델과 관계형 모델 간의 불일치가 존재해 이를 개발자가 바꿔줘야하지만 JPA를 사용하면 JPA가 바꿔준다. JPA의 장점 1. 객체-관계 매핑의 간소화 - 개발자가 객체지향 모델과 데이터베이스 스키마 간의 매핑을 해야하지만 이를 JPA가 해주기 때문에 생산성이 향상된다. 2. 쿼리 언어 - JPQL(Java Persistence Query Language)을 제공하여 객체 지향적인 쿼리를 사용..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/MI0Oq/btsFBceoj1L/uYvwZm8iY06tXGkdO0PwBk/img.png)
자바의 Call by Value / Call by Reference 함수의 매개변수에서 값을 복사하느냐 주소값을 참조하느냐의 차이이다. 자바의 데이터형은 크게 두가지로 나뉜다. 기본형(primitive type) - Boolean Type(boolean), Numeric Type(short, int, long, float, double, char) 참조형(reference type) - Class Type, Interface Type, Array Type, Enum Type, 기본형을 제외한 모든 것들 이 때 메서드의 파라미터에 원시값(primitive type)을 전달하는 것과 객체(reference type)를 전달하는 것에 동작 차이가 있다. 어떻게 이런 차이가 난 것일까? Call by Value..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/czifx2/btsFm8dqCap/SG6u4KPTXWYkh71Ce3rSFK/img.png)
코스피와 코스닥 종목을 가져오면서 해당 종목의 개수가 거의 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..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cJhrYG/btsFhhU6Ib9/LmzXKSi0ZDJ9EqmAkh9jb1/img.png)
프로젝트를 진행하면서 아주 중요한 문제 중에 하나인 동시성 문제가 발생하는 것을 깨달았다. 일단 내 프로젝트에서는 좋아요를 누르는 부분이나 조회수에서 동시성 문제가 발생하는데 사실은 동시성 이슈가 생겨도 크게 상관없는 부분들이긴 했으나 만약 개발하는 기능이 잔고 차감과 같은 동시성에 아주 민감한 기능일 수도 있기 때문에 동시성 문제를 해결해보려고 한다! 트랜잭션이란? @Transactional public PostLikeResponse pushPostLike(Long memberId, Long postId){ Post post = postRepository.findById(postId).orElseThrow(() -> { throw new NoSuchPostException(); }); if (isPos..