전체 글

안녕하세요. PS풀이, 개발일지 및 일기, 소소한 이야기를 적어가는 윤재 입니다.
· TIL ✍️
캐시란? 데이터의 원본보다 더 빠르고 효율적으로 접근할 수 있는 임시 데이터 저장소. 아래의 조건을 만족시킨다면 캐시를 도입했을 때 성능을 효과적으로 개선할 수 있다. 원본 DB에서 원하는 데이터를 찾기 위해 검색하는 시간이 오래 걸리거나, 매번 계산을 통해 가져온다. 캐시에서 데이터를 가져오는 것이 원본 DB의 데이터를 요청하는 것보다 빠르다. 캐시에 저장된 데이터는 잘 변하지 않는다. 캐시에 저장된 데이터는 자주 검색되는 데이터다. 캐시로서의 레디스 사용이 간단하다. 단순 키-값 형태로 저장하고, 다양한 자료 구조를 제공한다. 인메모리 데이터 저장소여서 데이터 접근 시간이 빠르다. 평균 읽기 및 쓰기 작업 속도가 1ms 미만이다. 자체적으로 고가용성 기능인 센티널 또는 클러스터를 제공한다. 캐싱 전략..
· TIL ✍️
1. 일관된 데이터 모델링 - 정규화를 적용하여 중복을 최소화 하여 데이터 무결성을 유지 2. 비즈니스 로직 분리 - 데이터베이스에 직접적인 비즈니스 로직을 내장하는 것을 피하고, 서비스나 애플리케이션 레이어에서 비즈니스 로직을 처리 3. 조회 최적화 - 필요한 데이터만 조회하고, JOIN 등 복잡한 연산 최소화. 필요한 데이터를 미리 계산하여 캐싱하거나, 뷰를 활용하여 미리 계산된 결과 조회 4. 인덱스 활용 - 필요한 칼럼에 인덱스를 생성하여 검색 성능 향상, but 과도한 인덱스 생성은 쓰기 성능에 부정적 영향 끼칠 수 있음 5. 쿼리 캐싱 - 자주 사용되는 쿼리 결과를 캐시하여 반복 실행 줄이고 성능 향상 6. 트랜잭션 사용 최소화 - 트랜잭션은 데이터 일관성과 무결성을 유지하기 위해 필요하지만,..
· TIL ✍️
@Configuration public class RedisConfig { @Value("${spring.data.redis.host}") private String host; @Value("${spring.data.redis.port}") private Integer port; @Bean public RedisConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory(host, port); } @Bean public RedisTemplate redisTemplate() { RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFact..
· TIL ✍️
문제 스프링 시큐리티로 API 인가 설정 중, /api/boards/best 는 권한 검증 없이 전부 볼 수 있지만, api/boards/{id} 는 검증을 해야하는 상황에서, new AntPathRequestMatcher("/api/boards/best", HttpMethod.GET.name()) new AntPathRequestMatcher("/api/boards/{id}", HttpMethod.GET.name()) 위의 두 API에서 best 와 {id}를 구별하지 못하는 문제가 있었다. 해결 스프링 시큐리티는 정규표현식으로도 매칭을 할 수 있는 클래스를 제공한다. new AntPathRequestMatcher("/api/boards/best", HttpMethod.GET.name()) new Re..
· TIL ✍️
쿼리 최적화 기법으로는 다양한 방법이 있지만, 7개를 꼽아보았다. SELECT 시에는 꼭 필요한 칼럼만 불러오기 조건 부여 시 가급적 기존 DB값에 별도의 연산을 걸지 않기 LIKE 사용 시 와일드카드 문자열(%)을 String 앞부분에 배치하지 않기 SELECT DISTINCT, UNION DISTINCT 와 같이 중복 값을 제거하는 연산은 최대한 사용하지 않기 같은 내용의 조건이라면, GROUP BY 연산 시에는 가급적 HAVING 보다는 WHERE 절 사용하기 3개 이상의 테이블을 INNER JOIN 할 때는, 크기가 가장 큰 테이블을 FROM 절에 배치하고, INNER JOIN 절에는 남은 테이블을 작은 순서대로 배치하기 자주 사용하는 데이터의 형식에 대해서는 미리 전처리된 테이블을 따로 보관 및..
· TIL ✍️
문제 H2DB 및 MySQL 타입 차이 이슈 JPA에서 String 타입만 선언 시, 기본적으로 MySQL에서는 TINYTEXT 타입으로 생성이 된다. TINYTEXT 타입은 최대 255자의 문자열까지 저장할 수 있다. Gifticon 엔티티의 gifticonUrl 필드는 TINYTEXT 타입으로 생성이 되어 있어서, 긴 길이의 URL은 저장이 되지 않는 문제가 있었다. @Column(name = "gifticon_url") private String gifticonUrl; 최초의 코드는 다음과 같다. @Column(name = "gifticon_url", columnDefinition = "TEXT") private String gifticonUrl; 그리고 변경한 코드는 다음과 같다. 이는 DB에 생..
· TIL ✍️
팀 노션 회의록 및 기록 보관소 및 5분 기록 보드에 적어놓고 정작 TIL에는 제출하지 못한 내용을 적어본다.. 문제 RDS의 시간대가 기본값으로 UTC+0이어서 (EC2에는 Asia/Seoul 설정이 되어 있음) DB에 UTC+0 시간으로 삽입됨. 해결 우선 AWS RDS로 가서, 파라미터 그룹 생성을 클릭 후 MySQL 8.0을 선택하고 이름은 자유롭게 지은 뒤 생성. 다음으로 생성한 파라미터 그룹으로 들어가서 time_zone 파라미터의 값을 Asia/Seoul 로 수정. 그 다음으로, DB 인스턴스로 들어가서 편집 -> 추가 구성 -> 데이터베이스 옵션 중 DB 파라미터 그룹을 위의 파라미터 그룹으로 변경 이후 재부팅을 해주면 적용이 되는 것을 볼 수 있다. (설정 변경하고 즉시 적용하더라도, 재..
· TIL ✍️
오늘은 주간 멘토링을 받았다. 오전 10시 10분에 받는 거였는데 팀원 한 분이 오전 6시까지 작업하시다가 졸아서.. 하마터면 멘토링 늦을 뻔했다 ㅋㅋ 멘토링을 고봉밥으로 받아서, 정리를 한다고 했는데 한번 더 정리를 해야할 것 같다. 크게 정리하면, 아키텍처 구상도 다시 하고, 기술 면접 준비를 잘 하자.. 이다 ㅋㅋ 우선 스프링 배치를 쓴다고 하니, 배치와 스케쥴링의 차이를 물어보셨다. 이건 단골 질문이니 알고 있었고, 정리를 하자면 배치는 특정 시점에 일괄 데이터를 처리하는 작업이고, 스케쥴링은 매 주기마다 특정 작업을 실행하는 작업이다. 또 팀원분이 스프링 쿼츠랑 스프링 배치에 대해 어느 것을 쓰는 지를 여쭤봤었는데, 스프링 배치라 쿼츠를 흡수하여 현재는 스프링 배치 라이브러리를 다운받으면 쿼츠도..
· TIL ✍️
리액트 작업을 하다가 useEffect 의 deps 를 [] 로 설정했음에도, 함수 부분이 2번 실행되는 문제가 있었다. 코드는 다음과 같다. function BuyPage () { const navigate = useNavigate() const { productId } = useParams() const { state } = useLocation() const { nickname } = useUserInfoStore() useEffect(() => { if (state === null) { navigate(`/products/${productId}`) } }, []) useEffect(() => { if (nickname === '') { alert('로그인 후 접근 가능합니다.') navigate(..
yunjae62
윤재의 개발 블로그