분류 전체보기

    [Spring/JPA] JPA 연관관계에서 지연 로딩과 즉시 로딩

    1. 도입 분명 스프링 강의를 들을 때 제일 집중해서 듣고 이해도 잘 되었던게 연관관계 매핑이었는데, 회사에서 사용하려고 하니 헷갈리는 부분이 너무너무 많았다.. JPA는 잘 사용하면 편리하지만 아무렇게나 쓰면 나도 모르는 쿼리가 많이 발생할 수 있는 것 같다. 팀에서 @Transactional 애노테이션을 모든 곳에 붙이지 않고, 한 트랜잭션으로 묶을 필요가 있는 경우에만 붙이기로 결정해서 쿼리와 서비스 단에서 연관관계에 있는 엔티티들을 어떻게 조회할지 고민이 있었다. 만약 쿼리에서 필요한 엔티티를 모두 조회하지 않고 지연 로딩을 활용한다면, 연관관계에 있는 엔티티가 실제 조회될 때 트랜잭션이 필요했기 때문이다. 그래서 동기랑 이것저것 테스트하면서 정리한 내용을 블로그에도 정리해보려고 한다. Sprin..

    [대규모 시스템 설계 기초] 2장 - 개략적인 규모 추정, 3장 - 효과적 면접을 위한 4단계 접근법

    [대규모 시스템 설계 기초] 2장 - 개략적인 규모 추정, 3장 - 효과적 면접을 위한 4단계 접근법

    2장 개략적인 규모 추정 2의 제곱수 최소 단위:1바이트=8비트=ASCII 문자 하나 2의 x 제곱 근사치 이름 10 1,000 1KB 20 1,000,000 1MB 30 1,000,000,000 1GB 40 1,000,000,000,000 1TB 50 1,000,000,000,000,000 1PB 모든 프로그래머가 알아야 하는 응답지연 값 메모리는 빠르지만 디스크는 느리다 디스크 탐색은 가능한 한 피하라 단순한 압축 알고리즘은 빠르다 데이터를 인터넷으로 전송하기 전에 가능하면 압축하라 데이터 센터는 보통 여러 지역에 분산 → 센터들 간에 데이터를 주고받는 데는 시간이 걸린다 가용성에 관계된 수치들 고가용성: 퍼센트 (100% = 한 번도 중단된 적이 없다) SLA(Service Level Agreeme..

    [대규모 시스템 설계 기초] 1장 사용자 수에 따른 규모 확장성

    단일 서버 사용자의 요청이 처리되는 과정 도메인 이름을 이용하여 웹사이트에 접속 DNS(Domain Name Servie)에서 IP 주소로 변환 IP 주소로 HTTP 요청이 전달 웹 서버가 HTML/JSON 형태의 응답을 반환 데이터베이스 RDB NoSQL key-value store graph store collumn stroe document store NoSQL이 적합한 경우 아주 낮은 응답 latency가 요구됨 다루는 데이터가 비정형 데이터를 직렬화/역직렬화만 하면 된다 아주 많은 양의 데이터를 저장 수직적 규모 확장(scale up) vs 수평적 규모 확장(scale out) scale up 트래픽 양이 적을 경우 수직적 확장, 단순함 단점 한계가 있다 (무한대로 증설 불가) 장애에 대한 자동..

    [Spring/JPA] @Version을 통한 낙관적 락(Optimistic Lock)

    낙관적 락 vs 비관적 락 한 자원에 여러 사용자가 접근할 경우 충돌을 방지하거나 데이터의 무결성을 보장하기 위해 동시성 제어가 필요합니다. JPA가 지원하는 동시성 제어 방법으로 낙관적 락, 비관적 락이 있습니다. 낙관적 락(Optimistic Lock) 낙관적 락은 충돌이 발생하는 경우에만 동시성 문제를 해결합니다. 여러 사용자가 동시에 접근하는 것을 허용하며, 충돌이 발생하는 경우에만 락을 통해 해결하는 것입니다. 낙관적 락은 데이터베이스에서 락을 사용하지 않고, 어플리케이션에서 락을 처리함으로써 성능을 개선할 수 있습니다. 비관적 락(Pessimistic Lock) 비관적 락은 충돌을 예방하기 위해 사용자들의 동시 접근을 막습니다. 즉, 동시성을 제한하기 때문에 리소스에 접근하는 사용자가 락을 획..

    AWS Certified Solutions Architect Associate - IAM 및 AWS CLI

    AWS Certified Solutions Architect Associate - IAM 및 AWS CLI

    https://www.udemy.com/course/best-aws-certified-solutions-architect-associate/ [Ultimate AWS Certified Solutions Architect Associate (SAA) AWS Certified Solutions Architect Associate 자격 SAA-C03 시험에 합격하기 위한 신규 주제, AWS 실용 지식, 시험 준비 방법과 문제 대비를 진행하는 강의 www.udemy.com](https://www.udemy.com/course/best-aws-certified-solutions-architect-associate/) IAM 및 AWS CLI IAM Identity and Access Management 💡Glob..

    [Github Actions] github actions로 Spring Boot secrets 관리 (application.yml)

    [Github Actions] github actions로 Spring Boot secrets 관리 (application.yml)

    gitignore로 DB나 AWS의 민감 정보들을 숨겨놓은 후, github actions를 활용하여 gradle build를 진행할 때 secrets를 활용해서 빌드를 성공하는 방법이다. cloud: aws: s3: bucket: ${S3_BUCKET} credentials: access-key: ${S3_ACCESS_KEY} secret-key: ${S3_SECRET_KEY} region: static: ${S3_REGION} auto: false stack: auto: false 먼저 aws S3 관련 설정을 application.yml에 다음과 같이 넣어두었다. application-private.yml 파일에 민감정보들을 담아두고 gitignore로 깃헙에 업로드되지 않게 하였다. reposit..

    [Spring] Kotlin + Spring boot 프로젝트에 Redis 적용

    build.gradle dependencies { ... implementation 'org.springframework.boot:spring-boot-starter-data-redis' } application.yml spring: redis: host: ${REDIS_HOST} port: ${REDIS_PORT} password: ${REDIS_PASSWORD} 비밀번호를 설정하지 않았다면 password는 빼도 된다 EC2에 도커를 활용하여 redis를 설치해서 ec2의 퍼블릭 ip와 설정한 포트번호를 추가하였다. ** docker에서 redis container 실행하기 sudo docker run -p 6379:6379 --name redis -d redis:latest --requirepass..

    [백준] 12738 - 가장 긴 증가하는 부분 수열 3 (자바 Java)

    [Gold II] 가장 긴 증가하는 부분 수열 3 - 12738 문제 링크 성능 요약 메모리: 181184 KB, 시간: 636 ms 분류 이분 탐색(binary_search), 가장 긴 증가하는 부분 수열: O(n log n)(lis) 문제 설명 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. 입력 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,0..

    [백준] 15684 - 사다리 조작 (자바 Java)

    [Gold III] 사다리 조작 - 15684 문제 링크 성능 요약 메모리: 298428 KB, 시간: 868 ms 분류 백트래킹(backtracking), 브루트포스 알고리즘(bruteforcing), 구현(implementation) 문제 설명 사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선이 같은 위치를 갖는다. 아래 그림은 N = 5, H = 6 인 경우의 그림이고, 가로선은 없다. 초록선은 세로선을 나타내고, 초록선과 점선이 교차하는 점은 가로선을 놓을 수 있는 점이다. 가로선은 인접한 두 세로선을 연결해야 한다. 단, 두 가로선이 연속하거나 서로 접하면..

    [Spring Boot & MySQL] 날짜 타입 저장하기 (LocalDateTime, Timestamp)

    프로젝트 진행 중 datetime을 저장하기 위한 타입 간의 설정이 맞지 않아서 애를 먹었다. 처음에는 MySQL: TIMESTAMP, Java: LocalDateTime으로 설정하였는데 MySQL의 timezone을 로컬에서만 서울로 설정해서 문제가 났다. 해결: application.properties의 sql timezone을 Asia/Seoul로 설정 spring.datasource.url=jdbc:[sql주소]?serverTimezone=Asia/Seoul&characterEncoding=UTF-8 이렇게 바꿔주면, timestamp로 저장한 값도 현재 시간으로 잘 설정되고 LocalDateTime.now() 도 문제없이 작동한다. 그렇다면 왜 Java에서 LocalDateTime을 쓰는 게 좋..

출처: https://gmnam.tistory.com/157 [Voyager:티스토리]