Today I Learned

  • Today I Learned

    Today I Learned

    [Java] JVM이란? 가비지 컬렉션(GC) 자바의 쓰레드 자바의 쓰레드 동기화 Volatile 람다와 스트림 [Spring] Spring Security Toby Spring [JPA] JPA의 필요성: 객체와 데이터베이스 간의 격차 해소하기 JPA의 장점과 그 원리(feat.영속성 컨텍스트) JPA 영속성 컨텍스트 생명주기 (OSIV) 연관관계의 주인이 다쪽에 있는 이유 [DB] 테이블 설계와 정규화 [OS] 공룡책 [Network] 컴퓨터 네트워크 하향식 접근 [개발 서적] 객체지향의 사실과 오해 Effective Java [알고리즘] Github LeetCode 문제풀이 [프로젝트 기록] 프로젝트 기록

프로젝트 기록

  • 2차 캐시를 이용한 최적화 기록

    2차 캐시를 이용한 최적화 기록

    개인 프로젝트에 2차 캐시를 적용하면서 데이터 최적화를 시도한 기록을 기록합니다. 🔍 자바의 표준 캐시 (JCache) JCache는 자바 애플리케이션을 위한 표준화된 캐싱과 매커니즘을 제공합니다. 캐싱 표준으로 설계되었기 때문에, 벤더 중립적입니다. 즉, JCache API를 사용하여 애플리케이션을 개발하면 다른 캐시 API로의 전환이 용이합니다. JCache는 다음과 같은 표준 인터페이스를 제공하고 공급자를 제공받음으로써 벤더 중립적인 개발을 가능하게 도와줍니다. CacheManager - 캐시 설정, 구성 및 종료를 담당하는 인터페이스 CachingProvider CacheManager의 생명 주기를 생성하고 관리하는 인터페이스 대표적인 공급자로 Ehcache, Hazelcast, Caffeine,..

  • [프로젝트 기록] fetch-join을 이용해 쿼리 최적화하기

    [프로젝트 기록] fetch-join을 이용해 쿼리 최적화하기

    프로젝트를 진행하면서 쿼리 최적화한 과정을 기록하려고 한다. SpringBoot3.x , JPA를 사용한 프로젝트이다. 🔍 연관관계 기본적으로 JPA를 사용하여 프로젝트를 진행하면 Delete, Update, 맵핑관계가 설정되어 있는 조회 로직에서 쿼리를 확인하고 최적화를 진행하고 있다. 이번에는 일대다 관계를 가진 엔티티를 조회할 때의 쿼리 최적화를 진행하였다. @AllOpen @Entity class Product( @ManyToOne @JoinColumn var category: ProductCategory, ) { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null } @Entity class ProductCat..

  • [프로젝트 기록] Redis와 직렬화/역직렬화

    [프로젝트 기록] Redis와 직렬화/역직렬화

    [ Redis 캐시 서버의 도입 ] Redis 캐시를 도입하면서 겪은 디버깅 과정을 글로 적어볼까 한다. Voca-World 프로젝트에 최근 사용자 정보를 캐싱하는 기능을 도입했다. 캐싱을 한 이유는 다음과 같다. 토큰을 기반으로 사용자 정보를 찾는 일은 매 요청시마다 발생한다. 사용자 정보는 자주 사용되지만 자주 바뀌지 않는다. 사용자가 로그인할 때 Redis를 통해 캐싱하였다. [ 문제 발생 ] 사용자 정보를 캐싱하고 나서 단어장이 보이지 않는 문제가 발생하였다. [ 문제의 원인 ] Redis에서 사용자 정보를 가져올 때 Vocabularies와 관련된 정보가 없는 것을 발견하였다. [ 문제 해결 과정 ] 코드를 확인해보니 vocabularies 필드에 @JsonIgnore 어노테이션이 붙어있었다. ..

  • 스프링 세션의 이해 - 등장 배경과 그 원리

    🔍 HttpSession ✏️ 세션이 왜 필요한가요? 웹에서 데이터를 전송하는 데 기본적으로 사용되는 HTTP는 본질적으로 상태가 저장되지 않는다. 즉, 동일한 사용자로부터 여러 요청이 들어와도 이를 인식하지 못한다. 그러나 웹 애플리케이션에서 사용자 인증, 장바구니 등과 같은 상태를 유지하는 것이 중요한 시나리오가 있다. 세션은 웹 애플리케이션이 특정 기간 동안 사용자를 인식하고 구분할 수 있게 함으로써 이러한 한계를 극복하는 데 중요한 역할을 한다. ✏️기존 세션의 문제점 전통적인 HttpSession은 컨테이너(ex. Tomcat) 에 종속되어 사용된다. 즉 컨테이너가 세션을 생성하고 애플리케이션에 세션 ID를 제공한다. 이런 방식은 기본적으로 클러스터링 환경에서 실행되는 경우 각 컨테이너가 자체 ..

  • [프로젝트 기록] Redis 메인/레프리카 서버 만들기

    [프로젝트 기록] Redis 메인/레프리카 서버 만들기

    [ Redis 레프리카 서버 만들기 ] 이용하고 있던 Redis EC2의 이미지를 복제하여 새로운 인스턴스를 생성해주었다. 복제한 레디스의 정보를 확인해보자. redis-cli info Role설정이 master로 되어있는 것을 확인할 수 있다. 이를 replica로 설정해주자. replicaof (사설 IP) (포트번호) Ex ) replicaof 172.1.1.1 6379 다시 info를 입력하여 확인해보면 slave로 바뀐 것을 확인할 수 있다. 하지만 master_link_status: down임을 확인할 수 있다. /var/log/redis/redis-server.log의 기록을 살펴보면 다음과 같이 Connection refused가 발생하고 있음을 알 수 있다. 3291:S 11 Nov 20..

  • 인공지능 기반 웹 서비스 만들기

    인공지능 기반 웹 서비스 만들기

    낙서하듯이 그린 그림을 멋진 그림으로 바꿔주는 인공지능 기반 웹 서비스를 개발하고 있다. 이번 포스팅에서는 프로젝트를 진행하면서 고민했던 부분에 대해서 적어볼려고 한다. 프로젝트 구조 GPU 가상 서버는 비싸기에 로컬 컴퓨터를 이용하여 프로젝트를 진행했다. Ubuntu기반의 가상 머신을 Nginx로 사용하였으며 URL기준으로 프론트, 백엔드 포트로 포워딩해준다. 백엔드 서버는 요청으로 들어온 사진을 인공지능 서버에 가공 요청한다. 인공지능 서버의 작업이 완료되면 결과를 메일로 전송한다. Ubuntu 가상 머신을 사용한 이유 로컬PC를 이용해 다른 작업도 하다 보니 제한된 메모리와 자원을 할당하고 관리하고 싶었다. 가상환경에서, 특히 VirtualBox에서 GPU사용이 생각보다 까다로웠다. 프로젝트 기능 ..

  • 로컬 PC 서버 만들기

    로컬 PC 서버 만들기

    로컬PC를 서버로 만드는 작업을 하고 있습니다. 이번에는 호스트PC에서 VM머신으로 통신하는 방법에 대해 알아보겠습니다. 목표 사용자가 윈도우10 로컬PC의 아이피 주소로 요청을 하면 VM Main에 설치되어 있는 프로젝트 서버가 응답하는 것을 목표로 합니다. 사용자 요청 (외부) -> 호스트PC -> VM Main 순으로 데이터가 요청됩니다. 호스트PC : Windows 10 VM Main : Ubuntu 22.04.3 프로젝트 준비 VM 머신을 설치합니다. (VM 머신을 설치하는 방법은 다른 블로그 참조) Nginx, Apache 등의 프로그램을 쉽게 관리하고 구동하기 위해 Docker를 이용하겠습니다. Ubuntu에서 도커를 설치하는 방법은 다음과 같습니다. # 도커 APT 저장소 추가 # Add ..

  • 트랜잭션 전파 레벨 정하기

    트랜잭션 전파 레벨 정하기

    🔍 이메일 인증 기능 이메일 인증 기능을 구현하고 있는데 트랜잭션 전파레벨과 관련한 문제가 있어 이를 정리하고자 합니다. 현재 로직은 다음과 같습니다. 회원가입을 하면 이메일로 UUID를 포함한 URL이 전송된다. 링크로 접속을 한다. 2-1. 만료가 되지 않았다면 사용자 인증 처리 된다. 2-2. 만료되었다면 UUID만 바꿔서 이메일은 재전송한다. 문제는 2-2에서 발생하였습니다. 이메일에는 바뀐 UUID로 전송이 되지만 DB에는 업데이트가 되지 않았습니다. 🔍 문제의 원인 문제의 원인은 빨간색 박스에 있습니다. 스프링에서 @Transactional는 같은 트랜잭션 안에서 하나의 쿼리라도 에러가 나면 모두 롤백하는 원자적 특성을 가지고 있습니다. EmailToken이 만료가 되면 이를 새로 생성하고 예..

  • 서로 다른 타임존에서 데이터 핸들링 하기

    🔍 상이한 타임존이 가져오는 문제점 지금 하고 있는 "Voca-World"는 언어 학습 웹 서비스로 다양한 국가의 사용자가 이용할 예정이므로 서로 다른 타임존이 갖는 문제를 해결해야 했다. 가장 큰 문제는 오늘 공부한 단어를 조회하는 로직이었다. 만약 한국 시간으로 2023/07/28 06:00시에 단어를 저장했다면 UTC 시간을 갖는 국가의 경우 2023/07/27 21:00시가 된다. 즉 오늘 공부한 단어 조회가 안되게 된다. 🔍 단어 조회 로직 단어 조회 로직은 파라미터로 클라이언트의 시간을 전달받아서 날짜를 추출하는 형식으로 구성되어있다. @Override public List findWordsWithDate(WordDTO.Request request) { LocalDate now = DateFo..

개발 서적