개발 (26) 썸네일형 리스트형 멀티 프로세스 환경 DB 동시성 제어 서론 현재 진행중인 StudyHub 프로젝트를 2월말 출시한 뒤 사용자 유치를 위해 이벤트를 계획하고 있었다. 이벤트 순서는 다음과 같다. 1. 이벤트 시간이되면 회원이 홈 화면에 있는 이벤트 참여 버튼을 누른다. 2. GiftStock 테이블의 StarBucks를 GiftName으로 가지는 튜플을 조회해 재고가 남아있는지 확인한다. 3. 재고가 남아있지 않을 경우 요청을 예외처리하고, 재고가 남아있을 경우 재고의 개수를 (남아있는 재고 - 1) 로 update 한다. 4. Gift 테이블에 회원과 선물 정보를 insert 한다. @Transactional public GiftStock register() { GiftStock giftStock = giftStockRepository.findByGiftN.. [StudyHub] FK 매핑으로 인한 외래키 참조 무결성 문제 해결 서론 스터디허브 프로젝트에서 무분별하게 FK를 설정한 탓에 문제가 발생했다. 아래는 스터디허브의 회원, 신청, 스터디의 ERD이다. apply 테이블은 users, study 테이블의 식별자를 외래키로 참조한다. apply 테이블이 users 테이블의 데이터를 참조할 때 users 테이블의 데이터를 지우려고 하면 외래키 제약조건에 의해 에러가 발생할 것으로 예상된다. 테스트를 돌려서 확인해보자. 문제 UserEntity와 StudyEntity의 식별자로 ApplyEntity를 조회하는 기능의 단위 테스트를 작성했다. @Test void 유저식별자와_스터디식별자로_스터디요청_엔티티_조회() { // given UserEntity user = userRepository.save(UserEntityFixtur.. [StudyHub] unknown column '필드명' in 'field list' 에러 해결 서론 unkown column ~~ in field list 에러가 발생하기 하루 전, 엔티티의 테이블명, 컬럼 이름을 바꾸고 로컬에서 테스트를 마친 뒤 배포 서버에 배포했지만.. 게시글 전체 조회, 회원사진 저장, 회원 삭제 API가 정상적으로 동작하지 않는다는 프론트분의 메시지를 받았다. 로컬 테스트 환경에서는 잘 동작하는 것만 믿고 배포 환경에서 제대로 테스트해보지 못한게 불찰이었다. 흔들리는 멘탈을 부여잡고 팀원분과 함께 원인 분석을 해보았다. 문제 발생 스터디허브는 블루그린 배포 방식을 이용해 배포하기 때문에 main 브랜치에 커밋 할때마다 기존 서버가 종료되고 새로운 서버가 실행된다. 이 때 만약 ddl auto를 create로 잡게되면 매번 DB 테이블에 있는 튜플들이 초기화된다. 곧 서비스.. [StudyHub] 조회 메서드 반환 객체 분리 서론 프로젝트의 repository 레이어 단위테스트를 작성하던 중 개선사안 두가지를 발견했다. [개선 사안 1] 게시글 조회 관련 StudyPostRepositoryImpl 객체의 메서드들은 동적 쿼리 생성 시 아래 코드와 같이 반환값으로 각기 다른 dto를 반환하고 있었다. @Override public Slice findByInquiry(final InquiryRequest inquiryRequest, final Pageable pageable, Long userId) { QStudyPostEntity post = studyPostEntity; QUserEntity user = userEntity; QBookmarkEntity bookmark = bookmarkEntity; ...중략 @Overri.. DB 인덱싱 성능 테스트 개요 스터디 허브 프로젝트의 성능 개선을 위해 DB 인덱스에 관해 학습하던 중 문득 성능 차이를 눈으로 보고싶다는 생각이 들어 직접 구현하게 되었습니다. 프로젝트 설계 DB 인덱스 성능 테스트가 목적이기 때문에 설계를 간단하게 구성했습니다. 데이터 입력은 아래와 같은 로직으로 진행됩니다. 1. 클라이언트가 Post 요청을 보낸다. 2. 서버측에서는 이를 받아 랜덤한 문자열을 가지는 UserEntity를 100만개를 생성한다. 3. DB에 UserEntity 100만개를 saveAll 메소드를 이용해 저장한다. 조회 성능 테스트 성능 테스트는 다음과 같은 방식으로 진행됩니다. 1. 인덱싱하지 않은 상태로 DB에서 name을 조회해 동일한 name이 있을 경우 반환한 뒤 수행 시간을 측정한다. 2. 인덱싱한.. [StudyHub] 시큐리티 의존성 삭제 2023 11월 22일 앱센터 15기 서버파트 스터디를 진행중, 앱센터 내 도서관리 시스템의 아키텍쳐를 구축하고 있었습니다. 앱센터 회원이 학교 이메일로 인증을 받아 로그인을 진행할 때, 스프링 시큐리티를 사용해 필터 단에서 처리해줄 지 직접 DB와 통신해 로그인을 처리할지 의논하던 중 불현듯 한가지 생각이 들었습니다. StudyHub에서 시큐리티를 왜 사용하고있지??.... 프로젝트를 처음 진행할 때를 생각해보면 정말 무지성으로 "로그인 하는데 스프링 시큐리티를 안써?? 무조건 써야지!" 라는 안일한 생각으로 시큐리티를 사용했었습니다. 이유없이 무지성으로 작성한 코드(기술)는 유지보수의 후폭풍을 몰고온다는 사실을 StudyHub 프로젝트에서 체감했기 때문에 StudyHub 프로젝트에서 시큐리티를 썼을때.. 이전 1 2 3 다음