[인프런 워밍업 스터디 클럽] 0기 - 마지막 발자국 미니프로젝트 완료~배포

[인프런 워밍업 스터디 클럽] 0기 - 마지막 발자국 미니프로젝트 완료~배포


미니 프로젝트 1단계 완료

미니 프로젝트를 하면서 크게 깨닫은 점은 공부하게 된 것은 직접 프로젝트를 해봐야 강의나 책으로 배운 지식이 이해가 된다는 점이다.

강의 자료를 따라치는 것이 아니라 직접 뭔가를 만들다 보면 문제를 겪고 해결하면서 뭔가를 배우게 되는 것 같다.

- 동일 데이터 중복 입력 막기

 

2024-02-27 19:36:43.073 ERROR 28072 --- [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.IncorrectResultSizeDataAccessException: query did not return a unique result: 3; nested exception is javax.persistence.NonUniqueResultException: query did not return a unique result: 3] with root cause

 

완전히 동일한 팀 이름을 가진 팀을 2개 이상 등록하고, findByName을 통해 DB에서 해당 이름을 가진 팀을 조회해서 가져오는 중에 이런 에러가 발생했다.

구글링해보니 단일 결과가 예상되는 JPA 리포지토리의 메서드의 리턴 값이 복수로 나왔을 때 이런 에러가 발생한다고 한다.

처음부터 동일한 데이터가 중복해서 등록되는 것을 막았다면 이런 에러를 피할 수 있다.

나는 해당 해당 팀명에 unique key를 걸어서 처음부터 동일한 팀이름이 등록되지 않도록 막았다.

 

create table team

(

    id   bigint auto_increment,

    name varchar(255) not null,

    primary key (id),

    unique key (name)

);

 

최태현 멘토님이 코드리뷰 시간에 이와 비슷한 내용에 대해 이야기했었다.

만약에 어떤 사람이 회원 가입 버튼을 매운 짧은 시간에 여러번 눌러서 동일한 데이터가 중복해서 들어가게 되는 경우가 있다고 한다.

이런 일이 벌어지는 원인은 스프링은 보통 요청에 대해 1개의 스레드가 할당 된다. 한 스레드가 요청을 처리 하고 있는 사이에 다른 스레드가 다른 요청을 처리하게 된다.

거의 동시에 같은 요청이 2번 들어 왔을 때 한 스레드가 등록을 진행하고 있는 사이에 다른 스레드가 요청을 처리하는 바람에 이런 일이 발생하는 것이다.

이를 해결 하기 위해서 중복이 되면 안되는 데이터에 unique key를 걸어 놓거나 낙관적 락/비관적 락/ 유저 락 을 이용한다고 한다.

[\[Spring\] 스프링 동시성 처리 방법(feat. 비관적 락, 낙관적 락, 네임드 락) — 성장하는 성하 Blog](https://ksh-coding.tistory.com/125)

- 셀프 피드백

 

🤔 다른 방법으로 중복 데이터를 등록을 막을 수 있는 방법이 없을까?

🤔실제 서비스를 운영하다 보면 중복 데이터 등록 말고 또 어떤 문제를 겪을 수 있을까?

🤔 어떻게 하면 해당 문제를 미연에 방지 할 수 있을까?

사실 서비스 운영 중에 생길 수 있는 문제는 검색해보면 된다!

[Challenges of using REST APIs ](https://appmaster.io/blog/challenges-of-using-rest-apis)

Feedback: 실전에 가까운 프로젝트를 해보는 것이 좋을 것 같다.

지금도 보면 유저 로그인을 스크립트 코드나 매크로를 이용해서 악의적으로 수백번 등록할 수 있는데 이를 어떻게 막아봐야 될 것 같다.

 

배포: Amazon linux2와의 싸움

처음으로 AWS EC2를 이용해서 배포를 했다.

글쓴이는 이전에도 라즈베리파이에 flask 서버를 올려서 배포를 해본적이 있었다.

아래는 mysql을 설치 중에 나온 에러 메시지다.

에러 메시지는 찍어 놓은게 없어서 일단 비슷한 에러를 겪은 사람의 에러 메시지를 가져왔다.

[error "GPG key a is already installed" It happens](https://stackoverflow.com/questions/77884025/im-using-amazon-linux-and-trying-to-install-mysql-in-ec2-but-i-keep-getting-th)

ient-8.0.36-1.el9.x86_64.rpm: Already downloaded                      

[SKIPPED] mysql-community-client-plugins-8.0.36-1.el9.x86_64.rpm: Already downloaded              

[SKIPPED] mysql-community-common-8.0.36-1.el9.x86_64.rpm: Already downloaded                      

[SKIPPED] mysql-community-icu-data-files-8.0.36-1.el9.x86_64.rpm: Already downloaded              

[SKIPPED] mysql-community-libs-8.0.36-1.el9.x86_64.rpm: Already downloaded                        

[SKIPPED] mysql-community-server-8.0.36-1.el9.x86_64.rpm: Already downloaded                      

MySQL 8.0 Community Server                                         3.0 MB/s | 3.1 kB     00:00    

GPG key at file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022 (0x3A79BD29) is already installed

The GPG keys listed for the "MySQL 8.0 Community Server" repository are already installed but they are not correct for this package.

Check that the correct key URLs are configured for this repository.. Failing package is: mysql-community-client-8.0.36-1.el9.x86_64

 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022

Public key for mysql-community-client-plugins-8.0.36-1.el9.x86_64.rpm is not installed. Failing package is: mysql-community-client-plugins-8.0.36-1.el9.x86_64

 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022

Public key for mysql-community-common-8.0.36-1.el9.x86_64.rpm is not installed. Failing package is: mysql-community-common-8.0.36-1.el9.x86_64

 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022

사실 위 문제는 gpg 키를 갱신해주기만 하면 해결 된다.

리눅스에서 뭔가를 설치하기 위해서는 rpm, yum, dnf 가 해당 서버의 리포지토리를 이용해서 설치파일을 자기 서버로 가져와서 설치를 진행한다.

리포지토리에는 해당 설치 파일들이 저장되어 있는 외부 저장소의 주소가 적혀 있다.

이 저장소 주소에 접속하기 위한 키가 gpg이다. 기존의 gpg키로는 접속할 수 없었기에 때문에 gpg키를 2023 버전으로 갱신하니까 문제가 해결 되었다.

 

셀프 피드백

🤔 AWS EC2 서버는 진짜 안전한 서버인가?

일단은 내 ip만 해당 웹사이트에 접속하도록 바꿔 놓았고, 다른 보안 문제는 없는지 확인하고 다시 열 예정이다. AWS EC2에 대해 아는 것이 없으니 공부가 필요한 것 같다.

 

🤔 왜 많은 사람들이 다른 수많은 클라우드 서비스 중에서 AWS를 이용해서 배포를 할까?

🤔AWS EC2가 가지고 있는 장점은 무엇일까?

눈에 보이는 장점은 12개월 무료라는 점과 돈만 더 내면 쉽게 확장 할 수 있다는 점인 것 같다.

라즈베리파이를 이용해서 배포를 할 때는 서버 로그 기록에 가끔 해외에서 ssh 로그인을 하려는 시도가 있다고 나올 때가 있었다.

해외 접속을 아예 차단 해놔야 마음이 편하다. 아니면 다른 보안이 필요할 것 같다.

 

🧐 혼자서 문제를 해결하는 것도 정말 좋지만, 질문을 통해서 문제를 해결하는 것도 나쁜 것이 아니다.

계획 상으로는 1,2시간 안에 끝날 줄 알았는데 거의 하루 종일 거의 10시간 이상 써서 배포 하는데 시간을 지체한 것 같다.

이럴 때는 멘토님이나 아는 개발자분에게 질문을 해서 빠르게 문제를 해결하는 것도 나쁜 방법은 아닌 것 같다.

느낀점

생각보다 꾸준히 코드를 매일 공부하는 것이 쉽지 않았다. 어려운 개념을 이해한다거나 뭔가 어려운 것을 구현하는 것이 아니라 시간을 들이면 어떻게든 해결 할 수 있는 과제라서 쉽게 끝났던 것 같다.

문제는 건강이다. 하루에 10시간 이상 앉아 있으니 바로 목이 너무 아프다.

운동을 좀 하자.

이번 스터디는 스터디원들이 적극적으로 스터디에 참여하고 열심히 공부를 하는 게 눈에 보여서 자극을 많이 받았다. 다들 열심히 사니까 나도 열심히 살아야지

 

이번 스터디를 이끌어주신 최태현 멘토님과 인프런에게 정말 감사합니다.

 

참고

- 아래 강의 링크의 내용을 바탕으로 글이 작성됨

[자바-스프링부트-서버개발-올인원-인프런](https://www.inflearn.com/course/lecture?courseSlug=%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%84%9C%EB%B2%84%EA%B0%9C%EB%B0%9C-%EC%98%AC%EC%9D%B8%EC%9B%90&unitId=208208)

- SpringBoot 공식 문서

[Spring Boot Reference Documentation](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#getting-started)

 

댓글을 작성해보세요.