[NestJS] 네이버 뉴스 카테고리 지정하기 (3)
·
Development/Back-end
마지막 시리즈가 될 것 같다.이번 포스트에서는 Redis를 사용한 캐싱을 정리해볼 것이다. 전체 코드@Injectable()export class NewsCacheService { private readonly logger = new Logger(NewsCacheService.name); constructor( @Inject(CACHE_MANAGER) private readonly cacheManager: Cache, private readonly newsCrawlingService: NewsCrawlingService, ) {} private getCacheKey(category: Category): string { return `${CACHE_KEY_PREFIX}:${categ..
[NestJS] 네이버 뉴스 카테고리 지정하기 (2)
·
Development/Back-end
지난 포스트에서 네이버 뉴스에 카테고리를 지정하는 메서드를 구현했었다.이번 포스트에서는 네이버 뉴스에 카테고리를 지정 후 요청 파라미터와 일치하는 카테고리를 가진 뉴스를 반환하는 로직을 구현해보자. 전체 코드async fetchByCategory(category: Category): Promise { try { const query = CATEGORY_QUERY_MAP[category] ?? '뉴스'; const result: NewsItem[] = []; let start = 1; const FETCH_SIZE = 10; const TOTAL_ITEMS = 100; const MAX_START = 1000; while (result.l..
[NestJS] 네이버 뉴스 카테고리 지정하기 (1)
·
Development/Back-end
네이버 API 를 사용해 뉴스를 크롤링하고 반환 데이터를 보니 카테고리가 포함되지 않았다.뉴스를 카테고리별로 조회하는 기능을 구현하기 위해 우선 뉴스를 카테고리별로 분류해야 했다.이번 포스트에서는 Groq API로 뉴스에 카테고리를 지정하는 기능을 구현하는 과정을 작성해보겠다. 사실 처음은 Gemini 였다처음엔 Gemini API 무료 티어를 사용했었다.const response = await fetch( `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${apiKey}`, { method: 'POST', headers: { 'Content-Type': 'applicat..
[NestJS] Pipe 사용하기
·
Development/Back-end
인프런(Inflearn) - 따라 하며 배우는 NestJS 강의를 참고한 글입니다.https://www.inflearn.com/course/%EB%94%B0%EB%9D%BC%ED%95%98%EB%8A%94-%EB%84%A4%EC%8A%A4%ED%8A%B8-%EC%A0%9C%EC%9D%B4%EC%97%90%EC%8A%A4/dashboard?cid=327527 Pipe란?@Injectable() 데코레이터로 주석이 달린 클래스이다.데이터 변환 또는 데이터 유효성 검사 등의 작업을 수행하는 데 사용된다. 데이터 변환(Data Transformation)입력 데이터 형식을 원하는 형식으로 변환하는 것을 말한다.데이터 유효성 검사(Data validation)입력 데이터를 평가하고 유효하지 않은 데이터가 수신되면..
[Spring Boot] 어댑터 패턴 구현하기(with. JPA, Redis)
·
Development/Back-end
최근 프로젝트에 JWT를 통한 인증/인가와 로그아웃 처리를 위해 Redis를 사용하여 회원 관리 기능을 구현했다.그러다 선생님의 조언으로 어댑터 패을 알게 되었고, 바로 도입을 시도했다. 어댑터 패턴이란?클래스가 어댑터로 사용되는 패턴을 말한다. 어댑터는 서로 호환되지 않는 단자를 호환시켜 작동하게끔 한다. 객체 지향 프로그래밍 관점에서 본다면, 호환성이 없는 인터페이스들로도 동작할 수 있게 변환해주는 것이 어댑터 클래스이다. FlowService → RefreshTokenRepository (인터페이스) ↑ | ┌───────────┴───────────┐ | | JpaAdapter ..
[Spring Boot] @Data 알고 쓰기
·
Development/Back-end
@Data를 사용해야한다 vs @Data를 지양해야한다. 개발 블로그를 찾다보면 의견이 분분한 것을 볼 수 있다.필자는 "필요한 어노테이션을 @Data 하나로 전부 사용할 수 있네?"하며 단순히 편리한 어노테이션이라 생각하고 사용했다. 그러다 우연히 한 블로그를 보게 되었다. @Data@Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode를 합쳐놓은 lombok 어노테이션이다.POJO와 bean과 관련된 모든 보일러 플레이트를 생성한다. ※POJO?: Plain Old Java Object, 자바로 생성하는 순수한 객체를 의미한다. 사람들이 @Data를 지양하는 이유?블로그를 찾아보니 대부분의 사람들이 @Data 사용을 지양하고..
[Spring Boot] Spring Security + JWT + Redis 로그아웃 구현하기
·
Development/Back-end
지난 포스트 중에서 Redis를 사용한 로그아웃을 구현한 적이 있다.이번 프로젝트에서 Redis를 사용해 로그아웃을 구현하기 위해 지난 포스트를 보고 하려 했지만, 무언가 엉성한 코드가 가득하다는 것을 깨닫고 다시 작성해보려 한다. Redis 관련 설정은 건너뛰고, 어떻게 Redis를 사용해 로그아웃을 구현할 수 있는지에 대해 포스팅하겠다. RedisConfig 작성하기Redis 관련 설정을 위해 RedisConfig 클래스를 생성해 보자. @Configurationpublic class RedisConfig { //RedisTemplate 커스터마이징 @Value("${spring.data.redis.host}") private String host; @Value("${spring..
[Spring Boot] JWT 서명 알고리즘 (2) - HS256
·
Development/Back-end
이번 포스트에서는 HS256을 사용한 JWT 서명 알고리즘을 Spring Boot로 구현해볼 것이다. private final Key key;// HMAC SHA 키를 생성public JwtTokenProvider(@Value("${spring.jwt.secret}") String secretKey) { this.key = Keys.hmacShaKeyFor(secretKey.getBytes());} 우선 HMAC SHA 키를 생성한다. @Value("${spring.jwt.secret}") 로 application.properties에 작성된 JWT 시크릿 키를 주입한다. Keys.hmacShaKeyFor(secretKey.getBytes()) 는 제공된 비밀 키 문자열을 HMAC SHA-256 알..
[JWT] JWT 서명 알고리즘 (1) - HMAC, RSA
·
Development/Back-end
1. JWT 서명 알고리즘이란?JWT(JSON Web Token)은 크게 header, payload, signature로 구성되어있다. signature(서명)은 header와 payload를 각각 인코딩하여 마지막 부분에 비밀키를 넣는 구조로 생성되며, 토큰의 무결성을 보장하는 핵심 요소이다. 수신측은 이 서명을 통해 토큰이 변조되지 않았음을 확인한다. JWT 서명 알고리즘이란, 토큰의 위변조를 막기 위해 이 서명을 생성하는 데 사용되는 암호화 방식이다. 2. HMAC서명 알고리즘의 대표적인 예 중 하나인 HMAC은 대칭키 암호화 방식의 서명 알고리즘이다. 서명자와 검증자가 동일한 비밀키를 서로 공유한다. HMAC 서명은 메세지와 비밀키를 결합해 해시 함수를 적용하여 생성된다. 토큰 유효성을 검사할 ..
[Spring Boot] @Scheduled 사용하기
·
Development/Back-end
Spring Boot의 @Scheduled를 사용해서 스케줄 기능을 구현해보자. 로직 설명매분 0초에 로직 실행종료 시간이 현재 시간보다 이전이거나 같은 모든 Reservation을 조회Reservation이 존재한다면 삭제 @EnableScheduling 설정하기 스케줄러 기능을 사용하기 위해서는 메인 클래스에 @EnableScheduling 어노테이션을 추가해야한다. @SpringBootApplication@EnableSchedulingpublic class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); }} @Scheduled 사용해서 기능 ..