분류 전체보기
Flyway 적용해보기
들어가며 프로젝트를 진행하며 중간중간 db 구조 및 인덱스 등등이 달라짐에 따라 db 버전관리를 해야할 필요를 느꼈다. db의 버전 관리를 자체 문서 등을 통해 실행할 수 있지만 실수의 여지가 많다고 판단되었고 누군가가 스키마 변경을 실행해놓고 기록해두지 않느다면 놓칠 가능성이 크기때문에 우리는 버전관리 flyway를 적용해보기로 하였다 flyway 란 ? DDL, DML 등 스키마 변경을 정해둔 규칙에 따라 자동으로 DB에 적용해주는 DB 형상관리 툴이다. 동작 방식 flyway를 적용하면 flyway_history 테이블에 그 시점에 테이블 스키마에 대한 메타 데이터가 기록된다. 이후 flyway는 사용자가 정의한 sql 파일을 scan해서 migration의 버전과 작업을 인지한다. 만약 새로 정의..
N+1문제 개선기
들어가며 요즘카페 프로젝트를 진행하면서 개발자가 의도하지 않은 쿼리가 JPA로 인해 발생하는 문제점이 발생했다. 이를 개선하고자 한다. 엄청난 쿼리 카운트 ..................... 이걸 수정해보자 N+1 우리는 1개의 쿼리를 날렸을때 N개의 쿼리가 추가로 발생하는 것을 N+1 문제 라고 한다. ORM 기술인 JPA가 등장하면서 쿼리가 자동화되면서 발생하는 문제점이라고 할 수 있다. 객체에 대해 조회했을 경우에 연관관계매핑으로 관계 맺어진 다른 객체가 조회되는 것이다. 발생 이유 N+1 문제가 발생하는 이유는 JPA가 JPQL에서 SQL 생성할 때 Fetch 전략을 참고하지 않고 JPQL 자체만을 사용하기 때문에 발생한다. fetch = FetchType.LAZY 일 경우 findAll() ..
restAssured를 이용한 restDocs 와 OAS
들어가며 요즘카페 팀 프로젝트를 진행하면서 API 명세서는 노션을 통해 관리하고 있었다. 단순하게 노션을 이용하니 최신화, 오타 등 휴먼에러들이 많이 발생하였고 API 문서화 툴을 사용해서 작업하기로 하였다. 가장 도움이 많이 되었던 것은 공식문서이다. Spring REST Docs Spring REST Docs Document RESTful services by combining hand-written documentation with auto-generated snippets produced with Spring MVC Test or WebTestClient. docs.spring.io API 문서화 도구 도구로써 RestDocs와 Swagger를 고민하였다. Swagger 러닝커브가 적고, UI가 ..
Spring Security 없이 Oauth 구현기
들어가며 이번 ‘요즘카페’ 팀 프로젝트를 진행하면서 먼저 로그인 파트를 진행하게 되었다. 우리는 프로젝트로 로컬 로그인 외에 OAuth 로그인을 진행하게 되었다. 지금까지 프로젝트를 진행하면서 로그인 기능을 진행해보지 않았기 때문에 진행해보게 되었다. OAuth 흐름 1. Get /auth/{provider} 요청 사용자가 프론트엔드 로그인을 클릭시 서버로 Redirect를 한다. 이후 요청을 받은 서버는 Provider로 authURi를 생성하여 Redirect한다. 이후 Provider는 클라이언트로 Authorization code를 받는다. 💡 클라이언트에서 바로 Provider로 요청하지 않는 이유 ClientId, clientSecret 등 공개되지 않아야 하는 정보를 서버에서만 처리를 한다면..
[Database] 인덱스 인덱싱에 관하여
들어가며 인덱싱이라는 개념을 들어보기만 했다 . . 이론으로만 알았다 . . 인덱스 데이터를 빠르게 찾을 수 있는 하나의 장치이다. 도서의 색인이나 사전과 같이 데이터를 쉽고 빠르게 찾을수있도록 만든 데이터 구조. 인덱스는 흔히 B-TREE 라는 자료 구조로 이루어져 있다. 인덱스가 효율적인 이유 균형 잡힌 트리구조, 선형적으로 증가하는 대수확장성 때문이다. 인덱스를 만드는 방법 클러스터형 인덱스 테이블 당 하나 설정할 수 있다. primary key 옵션으로 기본키를 만들면 생성가능하다. unique not null 옵션으로 클러스터형 인덱스를 만들 수 있다. 세컨더리 인덱스 빈번하게 처리되는 질의문에서 WHERE 절 이후 조건을 인덱스화 클러스터 인덱스 기본키에 대하여 클러스터 인덱스를 생성한다 기본..
[Database] 스프링과 트랜잭션
들어가며 트랜잭션이란 DB에서 하나의 기능을 수행하기 위한 작업의 단위 이다. 여러 쿼리들을 하나로 묶는 단위이다. 커밋이 되었다 == 하나의 트랜잭션이 성공적으로 수행되었다. 트랜잭션 정의 이유 DB에서 데이터를 다룰때 장애가 일어날 때 데이터를 복구하는 작업의 단위 여러 작업 동시에 같은 데이터를 다룰 때 작업을 서로 분리하는 단위가 됨 트랜잭션은 전체가 수행되거나 전혀 수행되지 않아야함 (ALL OR NOTHING) 트랜잭션의 ACID 특징 원자성 일부만 수행되는 일이 없도록 전부 수행되거나 아예 수행되지 않아야함 all or nothing일관성 트랜잭션은 db의 일관성을 유지해야함 일관성 트랜잭션을 수행하기 전이나 수행한 후나 db는 항상 일관된 상태를 유지해야함 일관 되게 조건,규칙에 유효해야함..
[Database] 정규화 과정
들어가며 잊고 있던 정규화 과정을 다시한번 기억해보며 .. 회사에서는 2단계 이상하면 많이한거랬나.. 3단계였나 기억이안나네 정규화 과정 릴레이션 (테이블) 간 잘못된 종속 관계로 DB 이상현상이 발생한다. 이를 해결하거나 저장공간을 효율적으로 사용하기 위해 릴레이션을 여러개로 분리하는 과정이다. DB 이상현상이란 ? 삭제 이상 내가 원하는 값만 테이블에서 삭제하고 싶은데, 하나의 튜플이 삭제를 원하지 않는 속성값도 갖고 있기에 같이 지워져서 발생하는 문제 삽입 이상 내가 원하는 값만 테이블에 삽입하고 싶은데, 테이블에 필요하지 않은 필드들 때문에 원치 않는 필드의 값도 삽입해야 하는 경우 발생하는 문제 ex) null 수정 이상 투플 수정 시 중복된 데이터의 일부만 수정되어 데이터의 불일치 문제가 일어..
orElse 에서 생긴 문제 해결
들어가며 프로젝트를 진행하던 중에 로그인 -> 카페 좋아요 -> 새로고침 후 로그인 -> 좋아요 데이터 증발 하는 문제가 발생했다. 우리팀 폴로는 문제의 원인이 orElse 쪽 문제라고 알려주었다. 그래서 한번 보았다. 문제 final Member member = memberRepository.findById(memberInfo.openId()) .orElse(saveNewMemberWithAllCafes(memberInfo)); 우리의 예상은 찾은 멤버가 없어서 null 일 경우 saveNewMemberWithAllCafes(memberInfo)를 실행할 것 같았다. 근데! null이던 아니던 상관없이 saveNewMemberWithAllCafes(memberInfo)가 실행되는 것이었다!!! publ..
[우아한테크코스 5기] 레벨3 3주차 회고
들어가며 이번 3주차를 진행하면서 프로젝트 팀에서는 간단한 CICD를 모두 구축을 해놓고 코드 구현에 들어가기로 하였다. 또한 MVP 모델에 대한 도메인 설계를 진행하였다. 그리고 근로를 진행했다. 프로젝트 MVP 모델 설계 우리는 이미 mvp 모델 설계를 진행했었는데 이를 다시 보면서 수정할 사항을 알아봤다. 처음에는 걱정도 많았다. 도메인에 대한 규모가 크지 않은 것 같아서.. 팀원들에게도 말했었는데 크기만 늘어난다면 CRUD만 반복할 것이고 의미가 없을 것 같다. 좀 더 깊게 가져가는 방향으로 진행하자 라는 의견을 들었다. 나의 생각은 어느정도의 규모를 가지고 있으면 리팩토링 및 고도화 할 것도 많이 보일 것 이고 충분히 진행할 수 있다는 의견이였지만 다른 팀원 모두가 지금도 충분하다는 의견이였기에..
[우아한테크코스 5기] 레벨3 1, 2 주차 회고
들어가며 레벨3를 6월 27일에 시작하고 2주가 지났다. 지난 2주동안 많은 일을 해왔는데 잊기 전에 정리를 하고 싶었다. 프로젝트 처음 기획 처음에 프로젝트 발표가 났을 때 나는 오션, 연어, 도치, 폴로, 아인, 고니, 솔로스타 7명과 함께 스와이프 쇼핑 이라는 주제를 시작하게 되었다. 고니가 발표했던 아이디어 인데 처음에는 잘 이해가 가지 않는 주제이기도 하였다. 그렇게 1주차에 크루들과 많은 이야기를 진행했다. 처음 기획안은 아래와 처음 기획안은 다음과 같은 느낌의 쇼핑몰로 좌우 스와이프를 통해 쇼핑 상품을 선택하는 것이었다. 실제로 이커머스 제작 과 쇼핑몰 중개 서비스에 대한 고민을 진행하였고 실제 결제를 유도하기 보다는 스와이프를 통해 사용자가 빠르고 편리하게 옷을 선택하고 특정 커머스로 중개..