뭔가 이것저것 해보려다가 아무것도 못한 사람됨....울적해지지말고 많이 보고 배우면서 힘내자 🐳🐳🐳
오늘 한 일
-ec2 rds 에 dummy 데이터 넣어보기 -> 인텔리제이에서 쿼리 콘솔을 처음 사용해봤다! 쿼리 보낸 내역과 그 결과를 한 눈에 볼 수 있는게 신기했다! (mysql 은 다운받았다가 인텔리제이랑 연결이 잘 안돼서 일단 삭제함)
-캐시 흐름 이해하기 + 스케줄러 기능
-ElasticCache 가 무엇인가
🫧 팀원의 캐시관련 스케줄러 코드
// keyword 캐시 10분 단위로 db에 저장 후 삭제
@Transactional
@Scheduled(fixedDelay = 1000 * 60 * 10)
fun flushAllCache() {
// 캐시에서 순위 정보 가져옴
zSetOperations.reverseRangeWithScores(REDIS_KEY, 0, 9)
?.map { // 목록들을 엔티티로 변환
keyword -> KeywordStore(keyword.value!!, keyword.score!!.toLong(), ZonedDateTime.now())
} // db에 저장
?.also { keywords -> keywordRepository.saveAll(keywords) }
// 캐시 삭제
zSetOperations.removeRange(REDIS_KEY, 0, zSetOperations.size(REDIS_KEY)?.minus(1) ?: 0)
}
@EnableScheduling
@Configuration
class SchedulingConfig
처음 캐시전략을 알게됐을 때 아니 도대체 캐시데이터를 어떻게 db 에 집어넣나 전혀 이해가 안됐었는데
캐시에 집어넣을 때와 마찬가지로 메서드로 꺼내서 보내면 될 일이었다!
kotlin의 함수 사용이 아직 안 익숙한 것 같다 🥲내가 했으면 일단 if 부터 집어넣었을 듯;;
🫧 ec2 접속하기
pem key가 있는 디렉토리에서 터미널 접속
ssh -i "${pem-key 이름}" ${ec2 주소}
접속 성공하면 이런 비둘기가 뜬다.
안되는 일
-직렬화/역직렬화 이해
컴퓨터 프로그램끼리 어떻게 데이터를 주고받고 그걸 안에서 어떻게 바꾸고 이런게 안 와닿아서 어려운 것 같다.
🚩직렬화/역직렬화
직렬화 Serialization
: 객체들의 데이터를 연속적인 데이터(stream) 으로 변형하여 전송 가능한 형태로 만드는 것
역직렬화 Deserialization
: 직렬화된 데이터를 다시 객체 형태로 만드는 것
통신하기 쉬운 포맷 : Byte, CSV, JSON 등등
자바의 원시타입은
Stack 에서 값 그 자체로 갖고 있어 외부로 데이터를 전달할 때 값을 일정한 형식의 raw byte 형태로 변경하여 전달할 수 있다.
그런데
원시타입을 제외한 객체들은
주소값을 갖는 참조형 타입으로 실제로는 Heap영역에 존재하고, Stack에서는 Heap 영역에 존재하는 객체의 주소(메모리 주소)를 갖고 있다.
❓Stack (Complie Time)
함수 호출 시 생성되는 지역변수, 매개변수가 저장되는 영역
프로그램이 자동으로 사용하는 임시 메모리 영역
❓Heap (Run Time)
사용자에 의해 관리되는 임시 영역으로 사용자 필요에 의해 동적으로 메모리 할당되는 곳
Stack 의 주소 값을 그대로 다른 곳에 보낸다면?
프로그램이 종료되거나 객체가 쓸모없다고 판단되면 Heap 영역에 있던 데이터는 제거된다.
본인 메모리에서도 데이터가 사라진다.
이는 결국 외부에 전송됐을 때도 해당 메모리 주소에 내가 전송하려고 했던 데이터가 있을리가 없다.
그래서 이 주소 값의 데이터를 원시타입으로 변환시킨 후에 전달해야 전송 시 유의미한 데이터가 된다.
우리가 사용하는 스프링 서버와 외부에서 실행 중인 Redis 서버가 데이터에 대한 작업을 위해서는 직렬화/역직렬화 과정이 필요하다. 이 때 적절한 직렬화 방식을 설정해주어야 한다. RedisTemplate 생성 시 직렬화 관련한 구현체는 다음과 같다.
JdkSerializationRedisSerializer
Default Serializer
SerialVersionUID 를 설정하지 않으면 클래스의 기본 해시값을 SerialVersionUID 로 사용함
-> 클래스 구조 변경 시 SerialVersionUID 가 달라서 역직렬화에 실패 java.io.InvalidClassException
-> 클래스 메타 정보들을 가지고 있기 때문에 직렬화시 용량이 비대해짐
=> 클래스 변경이 잦은 경우 사용 지양, 역직렬화 실패 시 예외처리 구현 必
GenericJackson2JsonRedisSerializer
클래스 타입 지정 없이 자동으로 Json 화
-> 직렬화된 데이터가 클래스 타입을 포함한다.
-> @class 필드에 해당 클래스의 패키지까지 함께 저장돼서 해당 데이터를 꺼내오기 위해서는 해당 루트, 경로에 같은 이름으로 해당 DTO class 를 생성해야만 사용 가능
Jackson2JsonRedisSerializer
@class 필드를 포함하지 않고 Json 화
->클래스 타입을 Serializer 에 함께 지정해주어야 한다.
redisTemplate.setKeySerializer(new Jackson2JsonRedisSerializer(String.class))
StringRedisSerializer
String 값을 그대로 저장
->별도로 Json 타입으로 변환(인코딩/디코딩)하는 과정이 필요
https://dev-monkey-dugi.tistory.com/150
'왕초보일지' 카테고리의 다른 글
240227 TIL | ERD 설계 고민 (2) | 2024.02.29 |
---|---|
240223 TIL | (0) | 2024.02.23 |
240220 TIL | 더미 데이터 집어넣기 (0) | 2024.02.20 |
240219 TIL | (0) | 2024.02.19 |
240218 TIL | Redis 사용 (2) | 2024.02.18 |