[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..
[JPA] 카테시안 곱 발견 후 해결 과정 (1)
·
Development/DB
최근 프로젝트를 진행하다가 오류가 발생하여 찾아보니 카테시안 곱 때문에 생긴 에러였다.카테시안 곱에 대해서 알아보고, 오류를 어떻게 해결했는지 작성해보려 한다. 카테시안 곱이란? 카테시안 곱이란 쉽게 말해 두 개의 테이블의 모든 행이 서로 짝지어지는 것을 말한다. JPA에서는 데이터베이스 쿼리 사용 시 테이블간의 조인이 잘못되어 발생하며, 예상보다 훨씬 많은 수의 결과 레코드를 생성한다. 문제 파악 org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags: [com.example.adhd_backend.entity.PlanItem.planItemContents, com.example.adhd_bac..
[OOP] S.O.L.I.D - 객체 지향 설계
·
Development/CS
이번 포스트에서는 S.O.L.I.D 에 대해 정리해볼 것이다. 참고 https://mangkyu.tistory.com/194 💡 SOLID란?객체 지향 프로그래밍을 하면서 지켜야할 5가지 원칙. 앞글자들을 따서 S.O.L.I.D 이다. 1) SRP, Single Responsibility Principle단일 책임의 원칙이란, 한 모듈이 하나의 액터, 즉, 한 종류의 서비스 로직을 수행할 수 있는 그룹에 대해서만 책임을 져야한다는 원칙이다. 왜 SRP를 준수해야할까? if 어떤 모듈이 여러 액터의 책임을 질 경우→ 여러 액터들에 대한 변경 요구가 올 수 있기 때문에 해당 모듈이 변경되어야하는 이유도 여러가지가 됨 if 어떤 모듈이 한 액터의 책임만 질 경우→ 한 액터에 대한 변경 요구만 책임지면 되..
[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 알..