2022-01-24-TIL
Today I Learned
Spring Caching
- https://mangkyu.tistory.com/179
Spring은 메서드 결과를 캐시에 저장하는 기능을 애너테이션으로 제공한다. 설정 클래스에 @EnableCaching을 붙여야 동작이 켜지고, 그다음 메서드에 아래 애너테이션을 붙인다.
| 애너테이션 | 동작 |
|---|---|
@Cacheable | 같은 인자로 다시 호출되면 메서드를 실행하지 않고 캐시의 값을 돌려준다 |
@CachePut | 메서드를 항상 실행하고, 그 결과로 캐시를 갱신한다 |
@CacheEvict | 캐시에서 항목을 지운다. allEntries = true면 전부 지운다 |
1
2
3
4
5
@Cacheable("books")
public Book findBook(String isbn) { ... }
@CacheEvict(cacheNames = "books", key = "#isbn")
public void updateBook(String isbn, BookDescriptor descriptor) { ... }
캐시 키는 따로 지정하지 않으면 인자로 만든다. 인자가 없으면 SimpleKey.EMPTY, 하나면 그 인자 자체, 여러 개면 모든 인자를 담은 SimpleKey가 키가 된다.
자주 겪는 함정은 자기 호출이다. 캐시 기능은 기본적으로 프록시로 동작하므로, 같은 클래스 안의 다른 메서드에서 @Cacheable 메서드를 호출하면 프록시를 거치지 않아 캐시가 적용되지 않는다. 캐시를 적용할 메서드는 다른 빈에서 호출되도록 배치하는 편이 안전하다.
Spring Properties 분리
- https://royleej9.tistory.com/entry/Spring-properties-%EC%84%A4%EC%A0%95-%EB%B6%84%EB%A6%AC?category=622505
- https://zzang9ha.tistory.com/348
개발, 운영처럼 환경마다 다른 설정은 프로파일별 파일로 나눈다. Spring Boot는 application.properties를 항상 읽고, 활성화된 프로파일이 있으면 application-{profile}.properties를 추가로 읽어서 같은 키를 덮어쓴다. 프로파일은 spring.profiles.active로 켠다.
1
2
3
application.properties 항상 로드
application-dev.properties dev 프로파일일 때 로드
application-prod.properties prod 프로파일일 때 로드
1
java -jar app.jar --spring.profiles.active=prod
공통 값은 application.properties에 두고 환경마다 달라지는 값(DB 주소, 외부 API 주소 등)만 프로파일 파일에 두면 중복이 줄어든다. 다른 파일을 끌어오려면 spring.config.import를 쓸 수 있다.
콘텐츠 기반 필터링
- http://wiki.hash.kr/index.php/%EC%BD%98%ED%85%90%EC%B8%A0%EA%B8%B0%EB%B0%98%ED%95%84%ED%84%B0%EB%A7%81
콘텐츠 기반 필터링(content-based filtering)은 추천 시스템의 한 방식이다. Google의 추천 시스템 강의는 이를 사용자의 이전 행동이나 명시적 피드백을 바탕으로, 사용자가 좋아한 아이템과 비슷한 아이템을 아이템의 특징(feature)을 이용해 추천하는 방법으로 정의한다.
강의의 예시는 앱 스토어다. 앱마다 카테고리나 게시자 같은 특징을 0과 1로 표시한 벡터로 나타내고, 사용자도 같은 특징 공간의 벡터로 나타낸다. 사용자 벡터는 사용자가 직접 고른 관심사나 이미 설치한 앱에서 얻는다. 그다음 사용자 벡터와 각 앱 벡터의 내적을 계산해서, 값이 큰 앱부터 추천한다. 두 벡터에 함께 1인 특징이 많을수록 내적이 커진다.
이 방식은 다른 사용자의 데이터 없이 한 사용자의 정보만으로 추천할 수 있다. 사용자 사이와 아이템 사이의 유사성을 함께 이용하는 협업 필터링(collaborative filtering)과 대비되는 점이다.
댓글
아직 댓글이 없습니다