Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: DeepL API에 뉴스를 요청하여, 번역된 뉴스를 가져온다. #47

Closed
1 task done
seokjin8678 opened this issue Dec 22, 2023 · 9 comments · Fixed by #58
Closed
1 task done

feat: DeepL API에 뉴스를 요청하여, 번역된 뉴스를 가져온다. #47

seokjin8678 opened this issue Dec 22, 2023 · 9 comments · Fixed by #58
Assignees
Labels
번역 번역 도메인 💎 핵심기능 핵심 기능에 관한 작업

Comments

@seokjin8678
Copy link
Contributor

seokjin8678 commented Dec 22, 2023

이슈 내용

아기다리고기다리던 DeepL API 요청을 통해 번역된 뉴스를 가져오는 작업을 구현해야 합니다.
작업 시 요청은 비동기 요청을 통해 가져오는 것이 효율적일 것이라 판단됩니다.

대충 생각한 프로세스는 다음과 같습니다.

  1. 사용자가 번역할 뉴스의 ID와 번역할 대상의 언어를 서버로 보냅니다.
    1.1. 검증 로직을 추가 해야 합니다. (원본 뉴스가 영어인지, 이미 해당 언어로 번역된 뉴스가 있는지 등)
  2. 서버에서는 요청에 대해 검증이 끝나면 "번역 요청을 했습니다." 와 같이 200 응답을 보냅니다. (201 응답도 고려해 봤으면 좋겠네요)
  3. 서버는 webClient를 통해 비동기로 뉴스의 번역을 수행하고, 번역된 결과를 DB에 저장합니다.

고려해야 할 사항은 비동기로 작업이 수행되기 때문에 사용자가 번역의 진행 상태를 알 수 없습니다. (네트워크 문제로 실패했는지, DeepL API 문제 등)
이것은 TranslateStatus와 같은 테이블을 만들어 PK로 News의 ID를 가지고, 컬럼으로 상태를 가지게 하여 처리하면 어떨지 싶네요.

  • 사용자는 뉴스의 ID로 조회하여, 번역이 성공했는지 조회할 수 있고, 실패했다면 무슨 이유로 실패했는지 알 수 있게 합니다.

또한, API 요청 마다 비용이 부과되니 따닥 문제와 같은 동시성 처리를 고려해야 합니다.
이것 또한 위의 TranslateStatus 테이블로 처리할 수 있을 것 같긴 합니다. (컬럼에 language가 추가되어야 합니다.)

  • NewsId, language를 복합 기본키 또는 복합 유니크키로 만들면 될 것 같아요.

의견 있으시면 의견 주시고, 없다면 빠르게 프로토타입 만들고 리뷰 받는 게 좋을 것 같네요!


@seokjin8678 seokjin8678 added the 💎 핵심기능 핵심 기능에 관한 작업 label Dec 22, 2023
@Laeng
Copy link
Member

Laeng commented Dec 22, 2023

크롤링 단계에서 deepl 번역도 해두면,

Spring batch 를 통해 크롤링과 Deepl 번역을 동시에 수행을 할 수 있을 것 같습니다.
(배치를 좀 더 자주 돌려야 하는게 단점이지만요)

이렇게 되면 최종 사용자에게 보여지는 것은 원문과, 원문 크롤링 시 자동 번역된 번역문이 보여지므로,
사용자가 번역의 성공 여부를 확인하지 않아도 될 것 같아요.

다만 배치에서 번역 돌릴 때 문제가 생겼던 것은 큐에 저장을 하고 추후 리트라이 하는 방식으로 구성해야 할 것 같습니다.

어떻게 생각하세용?

@seokjin8678
Copy link
Contributor Author

헉 환상적이네요. 👍👍
근데 제가 Spring Batch를 사용해본 적이 없어서 어떻게 구성해야할 지 감이 안 잡히네요. 😂
그리고 문제가 생긴 것을 큐에 저장하는 것은 메세지 큐를 사용한다는 말씀이신가요?

@Laeng
Copy link
Member

Laeng commented Dec 22, 2023

이 블로그 게시글에서 스프링배치를 어떻게 사용하는지 한눈에 잘 보여주는 것 같아요!

제가 말한 큐는 진짜루 자료구조의 Queue 였습니다 헤헤
번역에 실패한 것들에 대한 uuid 들을 레디스나, mysql 차곡차곡 순서대로 쌓아두고, 다음 배치때 순서대로 꺼내서 번역을 시도하면 좋을 것 같습니다! 헤헤

@seokjin8678 seokjin8678 added the 번역 번역 도메인 label Dec 22, 2023
@seokjin8678
Copy link
Contributor Author

흠 한 번 생각을 해봤는데요.
과연 번역을 할 뉴스가 배치를 사용할 만큼 많은가? 라고 생각했을 때 아니다 라고 생각이 들더라구요.
배치를 배우고 적용하는데 비용이 많이 들 것 같아서, 우선 수동으로 요청을 보내 번역된 뉴스를 가져오는 작업을 해보는게 어떨까요?

@seokjin8678
Copy link
Contributor Author

우선 API 설계와 엔티티만 설계하여 PR 올리겠습니다!
용어 정리가 필요할 것 같네요!

@seokjin8678
Copy link
Contributor Author

#54

@Laeng
Copy link
Member

Laeng commented Dec 23, 2023

배치를 도입하는데 효율이 낮다면 Spring 스케쥴러은 어떠세요?
배치에 비해 더 쉽게 도입할 수 있을 것 같습니다!

자동화를 꼭 해야하는 이유는 공식홈페이지에서 새 글이 올라오고 10분 이내에 번역본이 신속하게 올라오도록 하여 이용자가 번역본을 신속하게 접할 수 있기 때문이에요.
이를 통해 사용자를 늘리고요!

그래서 자동화가 꼭 필요합니다. 스케줄러 도입을 고려해주실 수 있으세요?

@seokjin8678
Copy link
Contributor Author

헉 그렇군요
알겠습니다! 최대한 핵심 기능으로 만들어야겠네요!

@Laeng
Copy link
Member

Laeng commented Dec 24, 2023

감사합니다!!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
번역 번역 도메인 💎 핵심기능 핵심 기능에 관한 작업
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants