📖
Kyu9's Repo
  • Library of mameil
  • 이슈 경험
    • 20230220_트랜잭션
    • 20230306_캐싱이슈
    • 20230722_테스트코드에서 @Transactional
    • 20230807_deadlock
  • 인턴 스터디
    • Gradle
    • Stream, Optional, 람다식
    • JVM의 메모리 구조, Garbage Collector
    • RESTful API
    • Microservice Architecture
    • HTTP
    • 웹서버란 무엇인가
    • Git Branch
    • TDD
    • Redis을 이용한 캐시
    • Thymeleaf
    • 정리가 필요한 자료들
    • SpringBoot Management
    • 테스크 코드 분할
  • 동아리 스터디
    • 기본 SQL 공부
      • SQL의 기본 개념
      • SELECT 문장을 이용하여 원하는 데이터 출력하기
        • 집합 연산자 사용하기
        • where절에 비교 연산자를 사용해보기
        • SELECT_EX
        • 산술 연산자 사용해보기
      • 단일 행 함수 사용
        • lower/upper 함수 사용하기
        • length함수 사용하기
        • concat함수 사용
        • substr/mid/substring 함수 사용
        • instr함수 사용하기
        • lpad/rpad 함수 사용하기
        • trim/ltrim/rtrim 함수 사용하기
        • replace 함수 사용하기
        • round 함수 사용하기
        • truncate 함수 사용하기
        • mod함수 사용하기
        • ceil함수 사용하기
        • floor함수 사용하기
        • power 함수 사용하기
        • Date fn(날짜 함수)
        • 형 변환 함수
        • 일반함수란
    • a-ha 실습
    • 혼자서 만들어본 게시판
    • AWS 강의
  • 학교 나머지 공부 자료
    • 웹프레임워크(Spring)
      • Spring이란?
      • Webframework1-1
      • Webframework1-2
      • SpringBoot의 특징
      • SpringBoot 생성 방법
      • Spring Data JPA
      • SpringBoot Security
      • SpringBoot HATEOAS
  • 공부 자료들
  • WS 온라인 자바 스터디
    • Week1(JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.)
    • Week2(자바 데이터 타입, 변수 그리고 배열)
    • Week3(연산자)
    • Week4(제어문)
    • Week5(클래스)
    • Week6(상속)
    • Week7(패키지)
    • Week8(인터페이스)
    • Week9(예외처리)
    • Week10(멀티쓰레드 프로그래밍)
    • Week11(Enum)
    • Week12(Annotation)
    • Week13(I/O)
    • Week14(Generic)
    • Week15(람다식)
  • 백준문제
    • 입출력과 사칙연산
      • We love kriii(10718)
      • 고양이(10171)
      • 개(10172)
      • A+B(1000)
      • A-B(1001)
      • AxB(10998)
      • A/B(1008)
      • 사칙연산(10869)
      • 나머지(10430)
      • 곱셈(2588)
    • for문
      • 구구단(2739)
      • A+B - 3(10950)
      • 합(8393)
      • 빠른 A+B(15552)
      • N 찍기(2741)
      • 기찍 N(2742)
      • A+B - 7(11021)
      • A+B - 8(11022)
      • 별 찍기 - 1(2438)
      • 별 찍기 - 2(2439)
      • X보다 작은 수(10871)
    • if문
      • 두 수 비교하기(1330)
      • 시험 성적(9498)
      • 윤년(2753)
      • 사분면 고르기(14681)
      • 알람 시계(2884)
      • 오븐 시계(2525)
      • 주사위 세개(2480)
      • 영수증(25304)
    • While문
      • A+B - 5(10952)
      • A+B - 4(10951)
      • 더하기 사이클(1110)
    • 1차원 배열
      • 최소, 최대(10818)
      • 최댓값(2562)
      • 숫자의 개수(2577)
      • 나머지(3052)
      • 평균(1546)
      • OX퀴즈(8958)
      • 평균은 넘겠지(4344)
    • 함수
      • 정수N개의 합(15596)
      • 셀프 넘버(4673)
      • 한수(1065)
    • 문자열
      • 아스키코드(11654)
      • 숫자의 합(11720)
      • 알파벳 찾기(10809)
      • 문자열 반복(2675)
      • 단어 공부(1157)
      • 단어의 개수(1152)
      • 상수(2908)
      • 다이얼(5622)
      • 크로아티아 알파벳(2941)
      • 그룹 단어 체커(1316)
    • 기본수학-1
      • 손익분기점(1712)
      • 벌집(2292)
      • 분수찾기(1193)
      • 달팽이는 올라가고 싶다(2869)
      • ACM 호텔(10250)
      • 부녀회장이 될테야(2775)
      • 설탕 배달(2839)
      • 큰 수 A+B(10757)
      • Fly me to the Alpha Centauri(1011)
    • 기본수학-2
      • 소수 찾기(1978)
      • 소수(2581)
      • 소인수분해(11653)
      • 소수 구하기(1929)
      • 베르트와 공존(4948)
    • 재귀
      • 하노이 탑 이동 순서(11729)
      • 피보나치 수 5(10870)
      • 별 찍기(2447)
    • 브루트 포스
      • 블랙잭(2798)
      • 분해합(2231)
      • 덩치(7568)
      • 체스판 다시 칠하기(1018)
      • 영화감독 슘(1436)
    • 집합과 맵
      • 숫자 카드(10815)
      • 문자열 집합(14425)
      • 숫자 카드2(10816)
      • 듣보잡(1764)
      • 대칭 차집합(1269)
      • 서로 다른 부분 문자열 갯수(11478)
    • 정렬
      • 수 정렬하기(2750)
      • 수 정렬하기 2(2751)
      • 수 정렬하기 3(10989)
      • 통계학(2108)
      • 소트인사이드(1427)
      • 좌표 정렬하기(11650)
      • 좌표 정렬하기2(11651)
      • 단어 정렬(1181)
      • 나이순 정렬(10814)
      • 커트라인(25305)
      • 좌표압축(18870)
    • 백트래킹
      • N과 M - 1(15649)
      • N과 M - 2(15650)
      • N과 M - 3(15651)
      • N과 M - 4(15652)
      • N-Queen(9663)
      • 스도쿠(2580)
      • 연산자 끼워넣기(14888)
      • 스타트와 링크(14889)
    • 이분 탐색
      • 수 찾기(1920)
    • 동적계획법
      • 피보나치 함수(1003)
      • 신나는 함수 실행(9184)
      • 01타일(1904)
      • 파도반 수열(9461)
      • RGB거리(1149)
      • 정수 삼각형(1932)
      • 계단 오르기(2579)
      • 1로 만들기(1463)
      • 쉬운 계단 수(10844)
      • 포도주 시식(2156)
      • 가장 긴 증가하는 부분 수열(11053)
      • 가장 긴 바이토닉 부분 수열(11504)
      • 전깃줄(2565)
      • LCS(9251)
      • 연속합(1912)
      • 평범한 배낭(12865)
      • 더하기(9095)
    • DFS와 BFS
      • 미로탐색(2178)
      • 바이러스(2606)
      • DFS와 BFS(1260)
      • 단지번호붙이기(2667)
      • 전쟁 - 전투(1303)
      • 숨바꼭질(1697)
      • 데스 나이트(16948)
      • 나이트의 이동(7562)
      • 녹색 옷 입은 애가 젤다지?(4485)
      • 음식물 피하기(1743)
      • A->B (16953)
      • 숨바꼭질 3(13549)
      • 숨바꼭질 2(12851)
    • 구현
      • 치즈(2636)
  • 프로그래머스 문제
    • SQL
      • Animal Table - Oracle
      • Animal Table - MySQL
      • Animal Table2 - Oracle
      • Animal Table 3,4 - Oracle
    • Lv1
      • 두 개 뽑아서 더하기
      • 제일 작은 수 제거하기
      • 문자열 내 p와 y의 개수
      • 예산
      • 자릿수 더하기
      • 두 정수 사이의 합
      • 같은 숫자는 싫어
      • 가운데 글자 가져오기
      • 수박수박수박수박수박수?
      • 나누어 떨어지는 숫자 배열
      • 2016년
      • 폰캣몬
      • 서울에서 김서방 찾기
      • 문자열을 정수로 바꾸기
      • 소수 만들기
      • 문자열 다루기 기본
      • 소수 찾기(에라토스테네스의 체)
      • 숫자 문자열과 영단어
      • 이상한 문자 만들기
      • 없는 숫자 더하기
      • 문자열 내림차순으로 배치하기
      • 문자열 내 마음대로 정렬하기
      • 약수의 개수와 덧셈
      • 콜라츠 추측
      • 자연수 뒤집어 배열로 만들기
      • 신규 아이디 추천
      • 비밀지도
      • 크레인 인형뽑기 게임
      • 실패율
      • 로또의 최고 순위와 최저 순위
      • 키패드 누르기
      • 정수 내림차순으로 배치하기
    • Lv2
      • 행렬의 곱셈
      • 영어 끝말잇기
      • 영어 끝말잇기
      • N개의 최소 공배수
      • 피보나치 수
      • 124 나라의 숫자
      • 짝지어 제거하기
      • 프린터
      • 다음 큰 숫자
      • 최댓값과 최솟값
      • 최소값 만들기
      • 숫자의 표현
      • JadenCase 문자열 만들기
      • 오픈채팅방
      • 영어 끝말잇기
      • 멀쩡한 사각형
      • 올바른 괄호
      • 위장
      • 기능개발
      • 더 맵게
      • 스킬트리
    • 완전탐색
      • 모의고사(Lv1)
      • 카펫(Lv2)
      • 소수 찾기(Lv2)
    • 정렬(Sorting)
      • K번째 수(Lv1)
      • 가장 큰 수(Lv2)
      • H-Index(Lv2)
    • 해시(Hash)
      • 완주하지 못한 선수(Lv1)
      • 전화번호 목록(Lv2)
    • 탐욕법(Greedy)
      • 체육복(Lv1)
      • 큰 수 만들기(Lv2)
      • 구명보트(Lv2)
    • 동적계획법(DP)
      • 정수 삼각형(Lv3)
    • 깊이/너비 우선 탐색(DFS/BFS)
      • 타겟 넘버(Lv2)
      • 네트워크(Lv3)
      • 단어 변환(Lv3)
  • 스프링부트 책
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
  • JPA 책
    • 프로젝트 세팅 및 기본설정
    • 영속성 관리 개념
    • 엔티티 매핑
      • 실습 예제
    • 연관관계 매핑 기초
      • 실습 예제
    • 다양한 연관관계 매핑
      • 다대일, 일대다 관계
      • 일대일, 다대다 관계
      • 실습 예제
    • 고급 매핑
      • 상속 관계 매핑
      • @MappedSuperclass
      • 복합 키와 식별 관계 매핑
      • 조인 테이블
    • 프록시와 연관관계 관리
      • 프록시
      • 즉시 로딩과 지연 로딩
      • 영속성 전이, 고아 객체
    • 값 타입
      • 임베디드 타입
      • 값 타입과 불변 객체
      • 값 타입의 비교, 컬렉션
    • 객체지향 쿼리 언어
      • JPQL part1
      • JPQL part2
      • JPQL part3
      • QueryDSL
      • NativeSQL
      • 객체지향 쿼리 심화
    • 응용 애플리케이션
      • 엔티티 설정
    • 스프링 데이터 JPA
      • 공통 인터페이스
  • Kotlin In Action
    • 코틀린의 특징
    • 코틀린의 기초
    • 함수 정의와 호출
    • 클래스, 객체, 인터페이스
    • 람다 방식
    • 코틀린 타입 시스템
    • 연산자 오버로딩과 기타 관례
    • 고차함수
    • 제네릭스
    • 애노테이션과 리플렉션
    • 코루틴
  • Oracle
    • Oracle 기본
    • Oracle 심화
  • SQL_연습
    • Revising the Select Query
    • Basic Select
    • Advanced Select
    • Basic Select 2
  • SQL 첫걸음(책)
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
    • Day 18
    • Day 19
    • Day 20
    • Day 21
    • Day 22
    • Day 23
    • Day 24
    • Day 25
    • Day 26
    • Day 27
    • Day 28
    • Day 29
    • Day 30
  • 더 자바 코드를 조작하는 다양한 방법
    • JVM 이해하기
    • 바이트코드 조작
    • 리플렉션
    • 다이나믹 프록시
    • 애노테이션 프로세서
  • 더 자바, 애플리케이션을 테스트하는 다양한 방법
    • JUnit5
    • Mockito
    • 도커와 테스트
    • 성능, 운영이슈, 아키텍처 테스트
  • 이펙티브 자바
    • item1 - 생성자 대신 정적 팩토리 메소드를 고려하라
    • item2 - 생성자에 매개변수가 많다면 빌더를 고려하라
    • item3 - 생성자나 열거타입으로 싱글턴임을 보증하라
    • item4 - 인스턴스화를 막기 위해선 private 생성자를 사용하라
    • item5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
    • item6 - 불필요한 객체 생성을 피하라
    • item7 - 다 쓴 객체 참조를 해제하라
    • item8 - finalizer와 cleaner 사용을 피하라
    • item9 - try-finally 보다 try-with-resources을 사용하라
    • item10 - equals는 일반 규약을 지켜 재정의하라
    • item11 - equals을 재정의하려면 hashCode도 재정의하라
    • item12 - toString을 항상 재정의하라
    • item13 - clone 재정의는 주의해서 진행하라
    • item14 - Comparable을 구현할지 고민하라
  • Elastic Search
    • 강의 Summary
    • Elastic Summary 개념 정리
    • Elastic Summary 적용 정리
  • 토비의 스프링 강의
    • 스프링부트 살펴보기
    • 독립 실행형 서블릿 애플리케이션
  • k8s
    • minikube 설치
    • jenkins 추가
  • Article
    • Choosing the Right MessageBroker
Powered by GitBook
On this page

Was this helpful?

  1. 이슈 경험

20230306_캐싱이슈

캐싱을 추가하는 과정에서 objectmapper을 기본으로 제공해주는 부분이 아니라 추가해서 넣어주고 싶었다 이유는 이러했음 캐싱을 적용해둔 이후에 막 Redis에 객체가 캐싱될것이다 그런데 만약에 캐싱되고 있는 객체의 정보가 변경되면 객체가 다르기 떄문에 수 많은 캐싱되어있는 객체들을 받으면서 에러를 막 뱉을 것이다 그래서 요런 것을 해결하기 위한 방법으로 ObjectMapper에 deserializationFeature의 DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES 요걸 세팅해주는 방법이다 뭐 추가로 더 필요한건 추가로 넣어주면됨 이렇게 redis에 대한 설정을 해주기 위해서는 기존에 아무런 세팅이 없었던 상황인데 각각의 추가 세팅이 필요했었다

위의 발생할 수 있는 에러 사항을 재현하기 위한 테스트는 이러하다 캐싱할 때 ttl을 좀 길게 잡아두고 테스트하고자 하는 객체를 캐싱한다 그리고 캐싱한 객체를 내 서버에서 변경하고 다시 그 객체를 redis 서버로부터 받게되면 에러가 발생!

정리해보면 캐싱을 캐시 서버에 저장해둔 상황에서 내서버에서 캐싱하기로 해둔 객체에 변화가 생겼을 때 캐싱된 데이터를 읽어올때 직렬화, 역직렬화에서 에러가 발생했다

직렬화, 역직렬화란 객체를 네트워크나 파일단위로 변환해서 해당 객체를 네트워크나 파일로 변환하는 것을 의미한다 이때 객체는 바이트 스트림 단위로 쪼개지고 이것을 직렬화라고 하며 다시 객체로 불러오는 과정을 역직렬화라고 한다

자 그럼 이제 objectmapper 을 입혀줘야 하는데 어디에다가 입혀야할까? 그 방법을 확인해보니까 Redis에서 왔다갔다 할때 사용되는 RedisTemplate에서 Serialize 시 커스텀한 ObjectMapper을 사용하는 방법이다

적용이 가능한 RedisSerializer에는 몇 가지 종류가 있다 JdkSerializationRedisSerializer

  • 요게 기본값으로써 기본 자바 직렬화 방식을 사용

GenericJackson2JsonRedisSerializer

  • 요놈의 장점은 별도의 클래스 타입을 지정해주지 않는다는 것이다

  • 알아서 직렬화 될 때 해당 클래스 타입과 해당 클래스의 패키지에 대한 정보가 함께 들어감

  • 그래서 문제는 직렬화는 괜찮지만 역직렬화하는 과정에서 보낸서버가 아닌 다른 서버에서 해당 값을 받는다고 가정했을 때

  • 역직렬화로부터 데이터를 받는 곳에서도 해당 클래스를 구현해두어야만 하고 해당 클래스의 패키지명도 반드시 같아야함

  • 즉, 하나의 서버를 가지는 구조에서만 유용하게 사용할 수 있다는 점이다

Jackson2JsonRedisSerializer

  • 요놈은 위의 GenericJackson2JsonRedisSerializer와 반대로 따로 클래스명을 지정하지 않는 대신 각각의 클래스별로 별도의 RedisTemplate을 지정해주어야 한다

  • 내가 오늘(3.6)에 삽질한 내용도 이러한 내용이다 이걸로 사용하다보니 단 하나의 객체를 캐싱하는 경우가 아닌 여러 객체를 캐싱하게 되면 그 각자의 객체에 대한 각각의 RedisTemplate을 지정해주어야 한다

StringRedisSerializer

  • 요놈은 String 값을 그대로 저장하는 방식이다

  • 그래서 문제는 Json 형태로 변환해서 저장하기 위해서는 직접 encoding, decoding을 해주어야 한다는점이 문제이다

결론은 이러함 GenericJackson2JsonRedisSerializer을 사용해서 처리했을때는 여러가지 객체로 각각의 RedisTemplate을 선언해야하는데... 일일이 선언하는건 벌써부터 거부감이 든다 그래서 Jackson2JsonRedisSerializer을 사용해서 처리하고 위에서 했던 시나리오(캐싱된놈!=변경된놈) 을 테스트해보니 local class incompatible: stream classdesc serialVersionUID Different error 이러한 에러가 발생해버렸다..! 해당 에러는 클래스 serialize id가 다르다는 에러 발생 요걸 해결하기위해 static final long serialVersionUID=1L 이렇게 강제로 해당 클래스에 대한 SID을 고정으로 넣어주었고 기존에 만들어놨던 테스트 코드에서 해당 에러가 사라진 것을 확인할 수 있었다 그리고 위에서 진행했던 테스트를 통해서 매핑도 정상적으로 진행되는거 눈으로 확인도 완료했다

그런데 이것도 방법이긴 하지만 완벽한 방법은 아니라고 사수님이 말씀하셨다 캐싱하는 과정에서 객체 변화로 인한 에러를 잡는 방법은 위처럼 클래스에 SID을 고정하고 에러를 나지 않고 자연스럽게 받을 수 있는 것만 받는 방법 그리고 추가로 redis에 키로 등록하는 과정에서 키에다가 회사 컴포넌트의 jar 버전을 넣어서 아이디를 구체화 시켜서 애초에 받지 않게 해버리는 방법 이렇게 2가지가 있다고 말씀하셨다

그래서 앞으로 해야할 일은 추가로 해당 캐시설정을 애노테이션으로 만들어서 사내에서 사용하는 라이브러리에 집어넣는 작업 그리고 jar 버전을 가져와서 키에다가 넣어서 컴포넌트의 버전이 달라지면 걱정없이 처리하는 방법으로 고도화

아이디를 버전을 통해서 관리하는 방법 먼저 진행했다 사내 라이브러리에 저걸 가져오는것이 있는데 문제는 그거다 >> 어떻게 @Cacheable, @CacheEvict, @CachePut, @Caching 요런 애노테이션 내부에서 id = “#변수명” 이렇게 저기 변수명에 내가 넣길 원하는 놈을 잘 파싱해서 넣어주어야 하는데 어떻게 넣을 것이냐

과거에도 애노테이션에 어떻게 변수를 넣을 것인가에 대한 삽질을 겁나게 했었는데 이 기회에 보자

변수를 넣는 방법으로는 (메소드에 선언할 수 있는놈들 기준으로) 해당 메소드의 파라미터에 넣고 싶은 변수를 넣어주는 방법이다

그래서 이번에 해본게 @Cacheable, @CacheEvict, @CachePut 을 달아둔 메소드에다가 추가로 jar 버전을 받도록 파라미터를 하나 더 추가했다

그렇게 추가하고 #뒤에 변수를 넣었더니 잘만 가져와 지더라!

Previous20230220_트랜잭션Next20230722_테스트코드에서 @Transactional

Last updated 2 years ago

Was this helpful?