삼성 SDS 알고리즘 특강 후기
·
대외 활동
지원한 이유이번 상반기에 진행했던 삼성SDS에서 주관하는 대학생 알고리즘 특강에 참여했다. 평소 알고리즘 공부를 소홀히 한 탓인지 항상 코딩테스트에서 좌절했었다. 혼자서 알고리즘을 준비하니 뭔가 체계가 안잡히는 느낌이 들었고 운이 좋게도 학교 에타에서 해당 공고을 발견하게 되어 망설임 없이 바로 지원하였다.합격자는 오롯이 지원서를 통해서만 선발된다. 개인적인 생각이지만, 지원서에 내가 이 특강이 필요한 이유를 진실되게 적는다면 무난히 선발되지 않을까 싶다. 또한, 재학 중인 학교와 학점 증명서를 제출해야 하기 때문에 학점 관리를 잘해놓는 것을 추천한다.참고로 특강은 C++과 Java로만 진행되며 Pro 시험 또한 2개의 언어로만 응시가 가능하기 때문에 파이썬을 이용해서 코테를 연습한 사람이라면 지원을 한..
로그인 코드 리팩토링 대장정
·
대외 활동/SOPT
미뤄두고 미뤄두던 로그인 로직 리팩토링.. 더이상 미룰 수 없다고 생각해서 이번에 코드를 새롭게 갈아엎어보았다. 그 과정을 살펴보자!기존 코드의 문제점 🤔SOLID 원칙 위반기존 코드의 가장 큰 문제점은 객체지향스럽지 못하다는 것이다.위의 코드는 AuthService의 코드 중 일부로 외부 네트워크와 통신하여 사용자의 정보를 받아오고 또 탈퇴하는 코드이다. 인자인 platform은 사용자가 가입을 할 때, 클라이언트에서 어느 플랫폼으로 가입을 시도했는지 서버에게 보내준 enum 값이다. 이 코드의 문제점은 무엇일까? DIP와 OCP에 위배된다는 점이다. 만약, 기획의 요구사항의 변경으로 구글 로그인이 추가되었다면 어떨까? 구글 서버와 통신하기 위한 로직과 클래스를 생성해야하는 것은 물론이고, 이 Aut..
스프링 트랜잭션과 전파
·
대외 활동/SOPT
문제점을 찾아보자!위 코드는 '한끼족보'에서 로그인을 담당하는 코드이다. 무엇이 문제일까?트랜잭션 범위RealMySQL에서는 트랜잭션의 범위를 최소화 하라는 조언이 있다. 특히, 외부 서버와 통신을 하는 과정은 트랜잭션 내에서 제거하는 것이 좋다고 한다. 프로그램이 실행되는 동안, 외부 서버와 통신할 수 없는 상황이 발생한다면 웹 서버 뿐만 아니라 DBMS 서버까지 위험해지는 상황이 발생할 수 있기 때문이다.다시 돌아와서, 코드를 살펴보자. 무엇이 문제일까?위 로직은, DB에 유저를 조회하거나 저장하는 로직과 함께 애플과 카카오 서버를 통해 사용자의 정보를 가져오는 getSocialInfo메서드 즉, 외부 서버와 통신하는 로직이 하나의 트랜잭션 단위로 묶여져있다. 만약, 카카오 서버에 문제가 생긴다면 어..
중복 추가 이슈를 해결하기 위한 고민
·
대외 활동/SOPT
메뉴 추가 동시성 이슈요즘, 동시성에 대해 공부하면서, 이전에 만들었던 프로젝트에서 발생할 수 있는 동시성 문제들에 대해 찾아보고 해결방법을 고민하고 있다. '한끼족보' 프로젝트에서는, 여러 명의 사람이 동시에 같은 메뉴를 추가할 경우, 같은 메뉴가 하나의 테이블에 여러 개 저장되는 현상이 발생한다.테이블 구조고민한 해결방법위의 문제를 해결하기 위해 고민한 방법은 2가지이다. 1. 유니크 키 제약조건(store_id, name) 컬럼 조합에 대해 복합 유니크 제약 조건을 걸어, 동시성 문제 해결하는 것이다.가장 간단한 해결 방법으로 DB 차원에서 중복 삽입을 자동으로 방지할 수 있다. 하지만 이 경우, DB단에서 발생하는 예외(유니크 키 제약 위반)를 service의 비즈니스 로직 상에서 try-catc..
비관적 락과 낙관적 락
·
대외 활동/SOPT
한끼족보에서 발생하는 동시성 문제'한끼족보'에도 동시성 문제(=Race Condition)가 존재한다.(테스트코드에 아직 미숙하여 curl 명령어를 이용하여 동시 요청을 해보았다.) 위 사진에서 볼 수 있듯, 2명의 유저가 동시에 하나의 가게에 좋아요를 누른다면, 해당 가게의 전체 좋아요 수가 2가 아니라 1로 집계되는 문제가 발생했다. 왜 이런 문제가 발생하는 것일까?문제 발생 원인위는 현재 '한끼족보'의 테이블 구조이다. '좋아요 수'를 비정규화 하여 가게 테이블에 위치해 있는 상태이다.@Transactionalpublic HeartCreateResponse createHeart(final HeartPostCommand heartPostCommand) { User user = userFi..
애플 로그인
·
대외 활동/SOPT
애플 로그인.. 정말 악명이 높다. 이번 프로젝트에서 소셜 로그인 구현을 담당하게 되었는데, 그 과정에서 학습한 애플 로그인부터 탈퇴까지 그 흐름에 대해서 정리해 보았다.Apple OAuth의 흐름사용자가 애플 계정으로 로그인을 하면 Apple 서버로부터 다양한 정보를 얻게 된다. 이 중 사용자 인증의 핵심 열쇠인 Identity Token과 Authorization Code 을 잘 기억해두자.Authenticating users with Sign in with Apple | Apple Developer Documentation위 링크는 애플 공식 문서에서 로그인에 대해 설명한 문서이다. 전체적인 흐름, 받아올 수 있는 정보 또는 받아오지 못하는 정보 등 굉장히 자세하게 적혀있으므로 꼭 위 문서를 꼼꼼히..
[아티클] SSH config를 통해 간편하게 SSH 연결하기
·
대외 활동/SOPT
저희는 지금까지 EC2에 접속하기 위해서 터미널에 아래와 같이 명령어를 입력해야만 했습니다.ssh -i "pem 키 위치" ubuntu@'퍼블릭 DNS 주소'너무 귀찮치 않으신가요?? 오늘은 이를 간편하게 접속할 수 있는 방법에 대해 알아보고자 합니다.1. .ssh 폴더 생성mkdir ~/.ssh (이미 존재한다면 이 단계는 넘어가셔도 됩니다!)2. 키페어 파일 가져오기EC2에 접속하기 위해 필요한 pem키!! 다들 기억하시죠? 현재 저장되어 있는 pem키의 위치를 홈 디렉터리 내의 .ssh 폴더로 이동시켜 줄게요.mv 'pem키이름.pem' ~/.ssh/그 후, 해당 pem키에 대해 권한을 설정해줘야겠죠? 아래 명령어를 입력합시다.chmod 400 "pem키 이름"3. Config 파일 설정하기그럼 이..
[아티클] JPA N+1 문제
·
대외 활동/SOPT
지연 로딩? 즉시 로딩?다들 3차 세미나 기억나시나요?@Entity@Getter@NoArgsConstructorpublic class Post extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String content; @ManyToOne(fetch = FetchType.LAZY) private Blog blog;}위의 코드는 3차 세미나에서 진행했던 코드 중 일부분입니다!저는 개인적으로 3차 세미나 내용을 복습하면서 fetch = FetchType.LAZY 가 무엇인지, 왜 지연 로딩 방식..
우당탕탕 서브모듈 도입기
·
대외 활동/SOPT
안녕하세요. 한끼족보 서버 개발자 김가연입니다.저희 한끼족보 서버 팀은 서버를 구축하기 위해 Spring Framework를 사용하고 있는대요, Spring에서는 애플리케이션의 설정 정보를 관리하는 파일이 있습니다. 바로 resoures폴더의 application.yml 파일입니다. DB와 연동하기 위한 비밀번호, 키 값과 외부 API를 이용하기 위한 API Secret 키 등 외부에 그대로 노출되어서는 안되는 기밀 정보들이 application.yml에 포함됩니다. 이러한 중요한 기밀 정보가 만약 Public Git 저장소에 노출되어 악용된다면 어마어마한 서비스 비용이 부과되는 등 매우 위험한 상황으로 이어질 수 있습니다.때문에 만약 Git을 사용하여 협업을 한다면 application.yml 파일은 ..