본문 바로가기

분류 전체보기243

[싹틔움] 11/08 개발일지 회원가입시 이메일 인증 받기 3 : 비동기 처리를 통한 성능개선 💡 목표 기존에 이메일 검증 과정에서 인증번호 요청을 보내면 위 이미지와 같이 평균 4.18 초의 요청시간이 걸렸다. 1. 실제 서비스를 운영하는 입장에서는 사용자가 회원가입 절차까지 들어왔다면 빠르게 회원가입 절차를 갖도록 하는 것이 중요하다. 만약 이메일 인증 버튼을 눌렀는데 4.2 초나 서버의 응답을 기다리고 있다면 사용자가 회원가입을 시도한 것을 후회해버릴 지도 모른다. 2. 이메일 발송은 상대적으로 시간이 오래 걸리는 작업이기 때문에, 이를 비동기로 처리하면 이메일 발송 대기 중에도 다른 요청을 처리할 수 있어서 서버 리소스를 효율적으로 사용할 수 있어 요청 대기시간이 많이 줄 것으로 예상된다. 3. 이메일 발송 작업 중 네트워크 지연이나 이메일 서버의 응답 지연이 발생하더라도, 서버의 회원가.. 2024. 11. 11.
[싹틔움] 11/07 개발일지 회원가입시 이메일 인증 받기 2 : 이메일 인증코드 검증 💡 목표이메일 인증번호를 받으면 회원가입을 하고자 하는 유저는 10분안에 인증번호를 입력해야한다.데이터베이스까지 접근을 할 필요가 없기 때문에 redis 를 활용해서 TTL 기능을 넣어 시간 제한을 걸었다.이메일 인증을 받지 않은 상태에서 가입하기를 누르면 인증번호를 받도록 설정도 필요했다. EmailCertificationController@PostMapping("/v2/auth/verify-certification")@Operation(summary = "인증번호 확인", description = "받은 인증번호를 확인하는 API")@ApiResponse(responseCode = "200", description = "요청이 성공적으로 처리되었습니다.")public ResponseEntity> v.. 2024. 11. 10.
[싹틔움] 11/07 개발일지 회원가입시 이메일 인증 받기 1 : 이메일 인증코드 전송 💡 목표회원가입시에 이메일 인증을 추가로 받아 중복방지 및 보안성 강화를 목적으로 두었다. build.gradle// Google Emailimplementation 'org.springframework.boot:spring-boot-starter-mail' 의존성 주입을 해준다.EmailConfig@Slf4j@Configuration@RequiredArgsConstructorpublic class EmailConfig { private final JavaMailSender javaMailSender; private final String SUBJECT = "[싹틔움] 인증메일 입니다."; public boolean sendCertificationMain(String email, Str.. 2024. 11. 10.
[싹틔움] 11/06 개발일지 Dev 환경에 맞게 코드 수정 🌱 배경기존에 localhost:8080 으로 코드를 짜던 방식에서 배포를 하게 되면서 기존 localhost:8080 을 window.location.origin 으로 두던 코드에서 모두 에러가 발생했다. 🌱 해결책 우선 dev 버전과 local 버전의 yml 파일을 나눴고, application-local.ymlapp: domainUri: http://localhost:8080 redirectUri: "http://localhost:8080/ssaktium/signin/"application-dev.ymlapp: domainUri: http://13.124.138.199:8080 redirectUri: "http://13.124.138.199:8080/ssaktium/signin/" Cus.. 2024. 11. 10.
[싹틔움] 11/05 개발일지 배포 : Github Actions 를 활용한 CI/CD 자동화 WorkFlow 🌱 CI/CD WorkflowCICD.ymlname: CI/CDon: pull_request: branches: ["main"]jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 - name: Install JDK 17 uses: actions/setup-java@v3 with: java-version: '17' distribution: 'temurin' - name: Build with Gradle run: | chmod +x ./gradlew .. 2024. 11. 10.
[Memo] NGINX 서버 접속해서 vim 설치하고 Blue/Green 방식의 무중단 배포를 위해 파일 생성 기존에 인스턴스의 SSH 에 접속해서 Docker 을 설치한 후 NGINX 이미지를 다운받아 컨테이너로 실행시켰다.sudo su 명령어를 통해 관리자 권한으로 명령어를 검색했다. NGINX 서버로 접속docker exec -it nginxserver bash  nginxserver container 로 들어가 접근했다.ls 를 입력해서 파일들을 확인 cd etc/ Tab 을 두번 누르면 안에 있는 파일들을 볼 수 있다. cd etc/ nginx/conf.d vim default.conf 명령어를 입력해서 default.conf 파일 수정을 시도하면vim: command not found 문구가 뜬다. docker container 는 vim editor 가 설치되어있지 않기 때문이다.VIM 설치 apt-.. 2024. 11. 10.
[Memo] NGINX 사용을 위한 yml 세팅 무중단 배포를 위해서 NGINX 를 사용하기 위해 yml 세팅을 해줬다. 소셜로그인 redirect url 설정을 위해서 application.ymlkakao: redirect-uri: "http://localhost:8080/ssaktium/signin/kakao"google: redirect-uri: "http://localhost:8080/ssaktium/signin/google"naver: redirect-uri: "http://localhost:8080/ssaktium/signin-naver" 기존에 위처럼 설정해줬었는데 배포를 하면 localhost 가 아니라 탄력적 ip 가 들어가야하기 때문에 설정을 추가해줘야했다. spring: profiles: active: local .. 2024. 11. 10.
[CS] 무중단 배포 Youtube : https://www.youtube.com/watch?v=glyxn7TY9OUPPT : https://docs.google.com/presentation/d/1vWpgH-pwMV-kFnMne10DK8m3-zxGcY9rrF7x9LkTsxw/edit#slide=id.g31585250fb5_0_173 2024. 11. 7.
[싹틔움] 11/2 개발일지 배포 : 인스턴스 생성 / SSH 에 Docker, Docker Compose, NGINX 설치 🌱 IP 와 PORT 의 개념IP 는 아파트 주소, PORT 는 호수로 비유할 수 있다.A 라는 아파트의 101호, 102호  라고 하면 동일한 아파트여도 다른 공간이다.아파트 주소를 알아야 우리가 찾아갈 수 있기 때문에EC2 인스턴스 PC 에 접속을 하기 위해 우리가 알아야하는 주소가 IP 이다.🌱 퍼블릭 IP 주소, 프라이빗 IP 주소 IP 주소는 퍼블릭 주소, 프라이빗 주소 , DNS 라고 있는데외부에서 컴퓨터로 찾아 들어갈 땐 퍼블릭 IP 주소로만 찾아서 들어갈 수 있다. 예를 들어서 한 회사에 a, b 라는 사람이 있다.회사 안에서는 서로 a, b 를 알고있지만 외부에서는 이 사람의 a 라는 이름, b 라는 이름을 몰라야한다.외부에서 누구나 알 수 있는 이름을 a-1, b-1 이렇게 지어 놓.. 2024. 11. 2.
[Spring] Swagger UI 적용 🌱 Swagger UISwagger UI는 RESTful API를 문서화하고 시각적으로 표현하기 위한 도구다. API의 엔드포인트, 요청 및 응답 형식 등을 사용자에게 쉽게 이해할 수 있는 형태로 보여준다.  🌱 Swagger UI 장점자동 문서화: Swagger UI는 API 코드에 주석을 추가하거나 Swagger Annotation을 사용하여 자동으로 API 문서를 생성한다. 이를 통해 개발자들은 코드 변경 시 문서도 함께 업데이트할 수 있다.인터랙티브: Swagger UI는 사용자가 API를 직접 테스트할 수 있는 인터페이스를 제공한다. 사용자는 요청을 보내고 응답을 확인할 수 있어 API의 동작을 쉽게 이해할 수 있다.시각적 표현: API의 엔드포인트, 요청 및 응답 모델을 시각적으로 표시하여.. 2024. 11. 2.
[Spring] Soft Delete 📚 배경1. 탈퇴한 회원의 계정으로 중복 계정 생성을 막을 때2. 데이터 분석을 위해서 탈퇴한 회원에 대한 데이터가 필요할 때3. 서비스 정책 상 탈퇴한 유저의 정보를 정해진 기간동안 유지할 필요가 있을 때 등 위와 같은 이유로 soft Delete 가 사용된다.직접 User Entity 에 userStatus 라는 필드를 만들어서 삭제 유무를 파악했었는데, Spring Boot 에서 이를 지원해주기 때문에 활용하는 방법에 대해서 알아보았다.User@Getter@Entity@SQLDelete(sql = "UPDATE users SET deleted = true WHERE id = ?")@SQLRestriction("deleted = false")@NoArgsConstructor@Table(name = .. 2024. 11. 2.
[싹틔움] 11/1 개발일지 회원 통합 기능 제공 실제 사례 조사 📚 배경싹틔움 프로젝트에서는 로컬 계정 회원가입과 카카오, 네이버, 구글 소셜로그인 기능을 제공한다. 다양한 회원가입 기능을 제공함에 따라 사용자들에게 하나의 통합된 회원으로 서비스를 사용할 수 있도록 환경을만들어 주기 위해 회원 통합 기능을 구현하고자 실제 사례들을 조사해보고 생각해보았다. 🌱 실제 사례넷플릭스회원 통합 방식: 넷플릭스는 사용자가 소셜 계정(예: 페이스북, 구글 등)으로 가입할 때 해당 이메일이 기존 로컬 계정과 일치하는지 확인한다. 만약 일치하면, 기존 계정과 소셜 계정을 연결하여 단일 계정으로 통합한다. 사용자는 이후 동일한 소셜 계정을 통해 로그인할 수 있으며, 로컬 계정이 있어도 비밀번호 인증 없이 소셜 계정으로 바로 로그인할 수 있게 했다.중복된 이메일 처리: 이미 다른 사.. 2024. 11. 2.
[싹틔움] 10/31 개발일지 싹틔움 프로젝트 Oauth2.0 적용 ( Kakao, Google, NAVER ) 📚 배경 기존에 위처럼 application.yml 파일에 kakao 소셜 로그인 설정을 해놨었는데, google 소셜로그인도 구현하기 위해서  //oauth2implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' build.gradle 에 위와 같이 추가를 해준 후에 다시 돌리니까 각 종 에러들이 발생했다. Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration'Error creating bean with name 'org.springframework.securi.. 2024. 11. 2.
[싹틔움] 10/30 개발일지 싹틔움 프로젝트 회원 중복 오류 고민 1 📚 배경A 라는 사람이 bigstarhan33@naver.com 이메일로 기존 우리의 로컬 회원가입을 통해 회원가입을 진행했다.그럼 이와 같이 User 데이터베이스에 데이터가 들어와 저장된다. 하지만 B 라는 사람의 카카오 이메일이 bigstarhan33@naver.com 로 기존 A 가 가입한 이메일과 중복된다면, 현재 로직대로면 A 의 데이터에 B 의 로그인 정보가 덮여지게 된다.  이처럼 기존 A 의 User Table 의 kakao Id 칼럼에 B 의 정보가 입혀진 것을 확인할 수 있다.🌱 social_email 칼럼 추가위 같은 문제가 발생한 이유는 kakao 로그인 시 기존에 kakao 회원가입이 되어있으면 이메일 중복 여부를 찾아서 로그인으로 진행하기 때문이다. 그럼 카카오로 로그인하는 .. 2024. 11. 2.
[싹틔움] 10/29 개발일지 회원 검증 로직을 매 요청에 추가를 해야하는지에 대한 고민 : 블랙리스트와 리프레시토큰 📚 [배경] userService.findUser(userId); 한 사용자가 로그인에 성공한 후에 토큰을 발급받은 상태에서 회원탈퇴를 한 후 해당 토큰을 가지고 남은 유효기간동안 다른 서비스에 접근하는 것을 방지하기 위해서는 매 서비스 시작 부분에 userService.findUser(userId) 코드를 추가해서 데이터베이스에 접근해 회원을 확인을 하는 과정이 필요했습니다.  하지만 해당 로직이 userId 를 통해서 user 객체를 가져와서 그 user 데이터를 다루는 로직이 아니라 단순히 조회만을 위함이라면, 메서드의 주요 목적과는 다른 코드이고, 항상 데이터 베이스 접근을 요구하기 때문에 이를 고민해볼 필요가 있었습니다.🌱 [요구사항] 회원 탈퇴 후에도 기존에 발급된 토큰이 남아 있을 경우,.. 2024. 11. 2.