목록2024/02 (16)
Skipalong's tistory
오늘은 기술면접 준비로 정리한 RDBMS의 정규화에 대해 정리해보겠다. RDBMS의 정규화에 대해 설명 데이터의 중복을 없애고 무결성을 향상 시키며 이상현상을 방지, 테이블 구성을 논리적, 직관적으로 만들며 데이터베이스 구조를 확장에 용이해지게 하기 위해 테이블의 키값과 컬럼값의 관계를 설정해주는 세 단계의 정규화 과정을 의미한다. 데이터의 중복을 줄이고, 무결성을 향상 DB 저장 용량 효율적 관리 가능 목적 : 데이터의 중복을 없애면서 불필요한 데이터를 최소화시킨다. 무결성을 지키고, 이상현상을 방지한다. 테이블 구성을 논리적이고 직관적으로 할 수 있다. 데이터베이스 구조를 확장에 용이해진다. 제 1 정규화(1NF) 테이블 컬럼이 하나의 값을 갖도록 테이블을 분리 시키는 것 만족해야 할 조건 어떤 릴레..
오늘은 기술면접 준비한 것 중 대용량 트래픽 처리법에 대한 부분을 정리해보겠다. 1. 트래픽 모니터링 트래픽 패턴을 모니터링하고 분석한다. 어떤 유형의 트래픽이 증가하였는지 어디에서 발생하고있는지 파악 2. 스케일 업(부품 업그레이드), 스케일 아웃(서버 증설) 서버자원을 확장한다 3. 로드 밸런싱 로드밸런서를 사용해 트래픽을 여러 서버로 분산시킨다 4. 캐싱 정적 콘텐츠를 캐시하여 반복적인 요청을 처리한다 5. DB최적화 데이터베이스를 최적화하고 인덱스를 조정,캐싱을 활용하여 성능을 향상 이중에서 캐싱을 해보았고 로드밸런싱에 대한 개념은 배운적이 있고, DB최적화에서 인덱싱은 해볼만 할 것 같다. 기술면접대비에서 배운 개념들을 내 프로젝트에 적용해보는 것이 즐겁고 개발자로서 한 걸음 더 성장하는 것 같..
전 TIL에 캐시를 저장해두고 캐시를 만료시키거나 삭제시켜주는 작업을 해두지 않으면 데이터의 변동이 있어도 캐싱된 데이터를 그대로 불러오게 되므로 잘못된 데이터를 가져오게 된다. 그래서 캐시를 만료시키거나 삭제해주는 작업을 해두는 것이 중요하다. 우선 만료시키는 방법은 전에 올린 CacheConfig 클래스에서 Map 형태로 CacheName을 키로 사용해서 Value 에 entryTtl(Duration.of~) 형식으로 값을 주어 CacheName별로 만료시간을 따로 정할 수 있다. @Override @CacheEvict(cacheNames = CacheNames.FEED, key = "#user.userId") public void uploadPost(User user, String content, ..
오늘은 길다면 길었고 짧다면 짧았던 최종프로젝트를 마무리하는 발표회가 있었다. 발표를 무사히 마무리하고 튜터님들이 찾아와서 우리 프로젝트와 관련된 질문들을 주셨는데 그 부분에 대한 정리를 휘발되기전에 정리를 해 두어야 할 것 같아서 정리를 해보겠다. 우선 질문을 굉장히 많이 받았는데 좋아요의 동시성문제를 파악하고도 적절히 처리해주지 않은 결정 이 부분은 사실 질문에 대한 답변이라기보다는 질책(?) 피드백(?)과 같은 부분이었다. 백엔드 개발자는 프론트단에서 비정상적인 상황에 대해서도 대응을 해주어야 한다고 하셨고, 이렇게 문제점을 파악하고도 처리하지 않은 것은 오히려 마이너스 포인트라고 하셨다. 동시성 테스트에 대한 해결방안으로 적어주신 낙관적/비관적 락킹, syncronized 에 대해 설명(RateL..
오늘은 캐시를 적용하면서 겪은 문제에 대한 트러블 슈팅을 정리해보겠다. 우선 서비스 메서드에 @Cacheable 메서드로 캐시설정을 해주고 요청을 보냈을 때 이런 에러가 났다. 이에 대한 해결법을 찾아보는데 "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" 을 dependency에 추가하면 해결이 된다고 하는데 이미 dependency 중 'org.springframework.boot:spring-boot-starter-web' 에 포함이 되어있는데 에러가 난 것이었다. 그래서 해결법을 찾던 중 직렬화과정중에 LocalDateTime 형식을 지원하지 않는것이 문제인 것 같았다. 그래서 해결법을 찾은것이 이렇게 캐싱하는 데이터중 LocalDateTim..
오늘은 Cache 를 코드에 적용한 것을 정리해보겠다. 우선 redis 설정은 email인증때 해두었으므로 생략하고 RedisCacheConfiguration 클래스의 defaultCacheConfig()를 이용해서 기본 세팅을 해주었다. 그리고 serializeValueWith메서드를 통해 value값의 직렬화설정을 해준다 key값은 String 으로 직렬화설정이 되어있고 value값은 Json을 바이트형태(?)로 직렬화해주는 설정이다. 그리고 형태의 Map 으로 캐싱대상에 따라 다른 설정을 해줄 수 있는데 인기 코스와 별점높은여행정보에 cacheName을 붙여주고 일단 30분의 만료시간을 주었다. 이렇게 설정을 해주고 SpringBootApplication에 @EnableCaching 어노테이션을 ..