Blog

[Spring][258] [2주차 멘토링] 질문내용 정리와 답변

Category
Author
Tags
PinOnMain
1 more property
Q. 페이징 처리에 관련된 코드 질문 우선 페이저블 객체를 사용하는것이 표준화되었다고 해서 페이저블 객체로 페이징을 구현해보았습니다.
페이징 처리에서 페이저블 객체를 사용하면 좋은점 조사
페이징 처리할 부분이 많아지면서 팀원 각자 기능에 페이징을 구현했는데, 추후 병합해보니 표현 방식이 조금 다른것을 발견했습니다.
동료는 페이저블 객체를 서비스 계층에서 사용했고, 컨트롤러의 매개변수에서 어노테이션으로 구현 한 것으로 차이가 있었습니다.
두 방식 중에 어떤 방식이 좋을지 판단이 어려워서 코드의 장단점을 조사해봤는데
두 코드의 차이점, 장단점 조사
성능적 차이가 발생할 만한 요소는 없는지도 궁금합니다.
또한 실무에서 어떤식 많이쓰는지, 단순히 개발자의 성향? 컨벤션을 정하는거에 따른것인지 궁금합니다.
A. 멘토님답변정리!
코드의 통일성을 맞추는것은 필수 어노테이션 기반은 자동화기 때문에, 내부적인 코드, 빌드 순서 등 동작의 흐름을 알기 어렵기때문에 문제 영익님것처럼 서비스에 구현하는것을 추천함, 장단점은 있지만 서비스가 더 직관적, 개발자가 컨트롤할만함.
Q. 페이징에 대해 아래와 같이 접근해보았습니다. 책 나눔 이벤트와 도서 사이에 1대N의 관계가 입니다. 처음에는 책 나눔 이벤트에서 도서를 패치 조인하여 페이징을 시도했는데 메모리에서 페이징이 되어 오작동의 위험이 있다고 알게 되었습니다. 그래서 도서 쪽(N)에서 패치 조인하여 페이징 처리를 진행했습니다. 이런 방식이 옳은 접근인지 궁금하고, 책 나눔 이벤트(1)에서 JPQL을 사용하여 직접 쿼리를 작성해 페이징을 시도할 때 발생하는 구체적인 문제점이 무엇인지 알려주실 수 있을까요? 그리고 도서 쪽(N)에서 페이징을 처리할 때 겹치는 문제나 다른 이슈가 있을 수 있는지도 여쭤보고 싶습니다
A. 멘토님답변정리! 우선 페이징 처리는 1이던 N이던 어디에서든 필요하다. 쿼리문이 어떤 식으로 작동되는지 보고 파악 할 필요가 있다. 페이징 처리를 하는 대상을 직접 가져오는 방법이 맞다.
Q. 코드 디버깅 중 특정 이슈에 직면했습니다. 디버깅을 통해 프로그램의 흐름을 멈췄음에도 불구하고 디버거를 통해 해당 객체를 조회하니 실제 쿼리가 전달되었습니다. 그 결과 디버거에서와 콘솔에서의 결과가 달라 혼란을 겪었습니다. 제가 문제를 탐색한 결과, Java와 ORM 프레임워크를 사용할 때 디버거로 객체의 상태를 확인하려고 할 때 그 객체에 설정된 지연 로딩이 동작하게 되어 이러한 문제가 발생하는 것을 알게 되었습니다. 이를 "디버거 지연로딩 트랩"이라고 하는 것 같더군요.
이에 대한 해결 방법이나 권장 사항이 있을까요? 특히 디버깅 중에 예상치 못한 데이터베이스 쿼리가 실행되는 것을 피하거나 데이터의 무결성 문제나 데이터 접근 문제를 방지하는 방법에 대한 조언을 얻고 싶습니다.
A. 멘토님답변정리! 객체에 어떤 데이터가 있을 지 디버거 커서가 넘어갈때 발생하는 문제인데, 실제 코드 실행과 디버깅 환경은 다를 수 있다. 문제가 아니라, 디버거를 사용하여 객체의 상태를 확인하면서 발생하는 데이터베이스 쿼리가 있을 수 있음에 주의해야 하며, 이로 인한 부작용을 방지하기 위해 충분한 주의가 필요합니다.
Q. 동일 http 메소드(get, post, put, delete), 동일 endpoint에서 Request parameter만 다를 경우 별도의 컨트롤러 함수를 생성해서 전달되도록 하려 했으나 동일한 경로로 취급이 되는지 에러가 났습니다. 그래서 이를 하나로 합친 후 파라미터 값에 따라서 별도의 서비스 메소드를 출력하는 형태로 생성해서 구현했습니다. 1. 동일한 경로에도 입력받는 매개변수 목록에 따라서 별도의 컨트롤러 메소드를 생성하는 것이 가능한지 궁금합니다. 2. 이것이 불가능할 경우, 혹은 일반적으로 매개변수 목록을 구분해서 별도의 서비스 메소드를 호출하는 것이 좋은지, 하나의 서비스 메소드에서 모든 매개변수 목록을 입력받은 후 서비스에서 이를 처리하는 것이 좋은지 궁금합니다.
A. 멘토님답변정리! 동일한 경로에도 입력받는 매개변수 목록에 따라서 별도의 컨트롤러 메소드를 생성하는 것은 불가능→ 메소드 레벨에서는 분리가 안된다. 실행부에서 조건문이나 service로 분기하는 것으로 해야한다. OR PathVariable로 api를 나누는 것이 맞을 수 있다. 매개변수 목록을 구분해서 별도의 서비스 메소드를 호출하는 것이 좋은지 → 지양해야 한다. API를 나눠서 설계를 해야하는 것이 필요하다. keyword , category 두가지 검색 유형이 겹치면서 4가지 유형이 나타나고
SRP
Single responsibility principle 하나의 역할만을 담당해야 한다. 원칙에 따라서, 우선 4개의 API로 구분되야 하는 것이 기본적으로 맞고, Controller / Service 모두 분기되는것이 맞다. 이후에 코드의 중복성 등을 고려하고 합치는 등 고려
Q. 도서 800mb 1000만건 도서 데이터를 수집했습니다. 저희가 생각하는 것은 우선 많은 데이터를 검색하는 쪽의 성능개선을 목표로하는데, 800mb짜리 1개의 파일과 같은 용량 자체가 큰 데이터를 처리하는것과 클라이언트로 전송하는 횟수와 서버에서 데이터를 처리하는 용량의 차이? 일반적인 기업은 이 중 어떤것을 중점으로 보는가?
A. 멘토님답변정리! 이미지나 영상같은것을 다룰수 있는 콘텐츠, 서비스를 먼저 정하고 추가 기능으로 해볼만하다. 횟수와 사이즈 둘다 경험해보는 것이 필요하다. 횟수적 대용량 데이터의 검색 최적화 만큼 , 대용량 파일의 최적화 IO처리도 중요하다.
Q. AWS 및 Github 비용에 대한 검토 요청 멘토님. 최근에 대용량 데이터 처리 프로젝트를 진행 중인데 AWS 대한 비용을 예산하였습니다. 이렇게 설계된 비용이 적절한지 혹은 다른 방안이 있는지 검토 및 조언을 얻고 싶습니다.
AWS EC2 (t3.micro): 40000원 (월 $30.12) RDS (t3.micro, 100GB): 124000원 (월 $91.84) LoadBalancer: 30000원 (월 $22.27) S3: 11500원 (월 $8.61) Redis (ElasticCache): 76000원 (월 $57) AWS Data Transfer: ???
이렇게 총 예산을 작성하였는데 비용의 적절성 혹은 비용을 줄일 수 있는 방법 혹은 잘못 작성한 비용이 있는지 등에 대한 조언을 얻고 싶습니다. 특히, AWS Data Transfer의 비용이 Ec2에 안에도 있는데 Ec2와 독립적으로 비용이 드는지 여부와 혹시 비용이 발생된다면 대략적으로 예상되는 비용과 함께 어떻게 절약할 수 있는지 조언 부탁드립니다.
A. 멘토님답변정리! 데이터 트랜스퍼, 아웃바운드 통신 비용.. → EC2에 Redis를 직접 RDS를 점검할 필요가 있다. , 각 서버의 스펙을 정확하게 체크하자. 이런 비용적인 측면을 잘 산정해보고, 각 서버의 하드웨어 스펙 점검, AWS Data Transfer 부분은 생각보다 비용이 낮을 수 있다. 먼저 로컬로 테스트해야하고, 실제 성능을 보기 위해서는 EC2 멀티랑, 로드밸런서까지 연결된 상태