Enum 그룹화를 통한 MemberRole 관리
·
프로젝트/COTATO.KR
현재 CS 퀴즈 프로젝트에서는 회원 역할을 통해 권한을 부여하고 있다.Ver1에선 대표적으로 아래와 같이 권한을 구분한다.현재 활동중인 부원(MEMBER) : 문제 풀이 가능교육팀원(EDUCATION) : 문제 업로드 및 풀이 진행, 결과 확인 가능운영진(ADMIN): 부원 관리 기능 및 모든 기능 가능//MemberRole.javaREFUSED("ROLE_REFUSED"),GENERAL("ROLE_GENERAL"),MEMBER("ROLE_MEMBER"),OLD_MEMBER("ROLE_OM"),ADMIN("ROLE_ADMIN"),EDUCATION("ROLE_EDUCATION");이외에도 현재 활동 중이지 않은 OM, 거절된 사용자, 승인 대기중인 부원 등 총 6가지의 역할이 존재한다.지금까진 특정 API..
정답 제출 API 멱등성 처리하기
·
프로젝트/COTATO.KR
앞선 글에서 HTTP 멱등성과 API의 멱등성을 구현하는 과정에 대한 내용을 정리했다.이번 글에서는 현재 Cotato 정규 세션 문제 풀이에서 사용하는 로직인 ‘정답 제출’ API에 멱등성 처리를 하는 과정을 글로 정리하겠다.정답 제출 API의 멱등성 처리 필요성정답 제출 API의 서비스 로직을 간단하게 정리하면 아래와 같다.정답이 아니면 제출 기록을 생성 후 저장한다.정답인 경우이미 득점처리가 되었는지 확인한다.득점자보다 해당 제출 기록이 더 빠르면 득점자로 대체한다.득점자보다 느리면 단순히 기록을 저장한다.이때 핵심은 정답 처리가 된 요청은 하나만 생성되어야한다는 점이다.하지만, 우리는 선착순으로 득점자를 정한다. 그렇기 때문에 사람들은 풀이가 허용되는 시점 이전에 무수한 요청을 보내는데 요청이 처리..
멱등성을 통한 정답 제출 API 중복 요청 방지 (이론)
·
프로젝트/COTATO.KR
지난 4월 27일 토스 서버 개발자 챌린지를 보며 결제 요청 타임아웃 처리에 관한 서술형 문제를 봤다. 💡 결제 요청간에 타임 아웃이 발생했다. 해당 요청이 성공했는지 실패했는지 사용자는 알지 못하지만, 결제 요청이 2번되어서는, 안되어서는 안된다. 어떻게 이 문제를 해결할 수 있을까?나는 이 문제에 답을 하지 못했는데, 이후 오픈카톡방의 후기를 보니 ‘멱등성’을 통해 결제 요청 처리를 한다는 이야기가 나왔고 관련된 검색을 하던 중 토스의 멱등성에 관한 글을 읽게 되어 멱등성에 대해 공부하게 되었다.읽고보니 비슷한 상황으로 인해 우리 코테이토 문제 풀이 요청 또한 결제 과정과 유사한 부분이 많다고 느껴졌고 멱등성 처리를 할 필요가 있다는 생각이 들었다.따라서, 오늘은 멱등성에 관한 내용을 정리하고, 이..
다량의 데이터 삽입 시간 줄이기
·
BE/개발일지
이번 네트워킹 과제는 지난 과제와 비슷하게 이어서 진행된 과제이다.과제레포지난 과제는 20여개의 엑셀에 있는 데이터를 파싱해서 삽입하는것이 포인터라면, 이번 과제는 파일의 크기가 10,000배 증가한 20만개의 데이터를 삽입하는 과제이다.우선, 기존 코드로 엑셀에 데이터를 넣어보자. DB에 20만개의 삽입 쿼리@Transactionalpublic void createData() throws InvalidFormatException, IOException { OPCPackage excel = OPCPackage.open(new File(EXCEL_PATH)); Workbook sheets = new XSSFWorkbook(excel); Sheet firstSheet = sheets.getS..
데이터베이스 기본키 생성 전략
·
BE/개발일지
개발을 하다보면 DB연결을 통해 자바 객체를 데이터베이스에 저장하곤 한다.이 과정에서 PK를 개발자가 직접 지정하지 않는다.보통 아래와 같은 방식으로 pk외의 다른 컬럼에 대한 값을 지정하고 save를 하는 시점에서 자동으로 PK가 결정되게 한다.@Builderpublic Property(String zipCode, String roadNameAddress, String landLotNameAddress) { this.zipCode = zipCode; this.roadNameAddress = roadNameAddress; this.landLotNameAddress = landLotNameAddress;}기본 키는 기본 키 제약조건에 의해 아래와 같은 조건을 만족해야한다.기본 키 제약조건n..
[프로그래머스: 입국심사 Java] 매개 변수 탐색
·
Algorithm/백준 문제풀이
다시 코테를 준비하는 요즘, 쉽다고 생각했던 이분탐색 문제가 조금 더 어려운 난이도로 등장해 애를 먹은적이 많다. 최근 치른 많은 코테에서 매개변수 탐색 문제를 쉽게 볼 수 있는데 관련해서 공부한 글을 정리해볼까 한다. 사실 어느정도 안다고 자신했는데, 우테캠 코테에서 최적화를 실패해 ,, 결국 탈락했으니 소 잃고 외양간 고쳐보자.이 글은 ‘프로그래머스 알고리즘 고득점 킷 - 이분 탐색 - 입국 심사’ 문제를 기준으로 작성하겠다. 글을 읽기전에 알고리즘을 어느정도 공부했다면, 해당 문제를 풀이를 고민해보고 글을 읽으면 도움이 될 듯 하다.https://school.programmers.co.kr/learn/courses/30/lessons/43238 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지..
퀴즈 객체 양방향 매핑 없애기
·
프로젝트/COTATO.KR
현재 퀴즈 ←→ 선지 , 퀴즈 ←→ 주관식 정답에선 양방향 매핑이 되고 있다. MultipleQuiz.java: Choice를 List로 매핑하고 있다. @Entity @DynamicInsert @NoArgsConstructor(access = AccessLevel.PROTECTED) @DiscriminatorValue(value = "MultipleQuiz") @Getter public class MultipleQuiz extends Quiz { @OneToMany(mappedBy = "multipleQuiz", cascade = CascadeType.ALL) private List choices = new ArrayList(); @Builder public MultipleQuiz(int number,..
여러 객체를 삭제할 때 쿼리 줄이기
·
프로젝트/COTATO.KR
현재 문제 업로드를 할 때 임시저장 기능 구현을 아래와 같이 하고 있는데, 임시저장과 최종 업로드 하는 기능을 같은 API로 사용하고 있다.사용자가 저장하기 버튼을 누르면 아래와 같은 작업이 수행된다.현재 해당 교육에 업로드된 모든 퀴즈를 삭제한다.요청 온 퀴즈를 다시 업로드한다.문제 상황현재 로직@Transactionalpublic void createQuizzes(Long educationId, CreateQuizzesRequest request) { Education findEducation = findEducationById(educationId); checkQuizBefore(findEducation); validateDuplicateNumber(request); q..
MethodArgumentNotValidException 처리하기
·
프로젝트/COTATO.KR
클라이언트가 RequestBody에 Request DTO에 값을 넣어보낼때 이 값을 @Valid 어노테이션을 사용해서 검사한다. 들어와야하는 값이 들어오는지에 따라 다음 3가지 어노테이션을 주로 써서 검사를 한다. @NotNull : 요청된 값이 null이면 거절, “” 또는 “ “는 허용 @NotEmpty : 요청된 값이 null 또는 “”이면 거절, “ “는 허용 @NotBlank : 요청된 값이 null, “”, “ “이면 거절 이 외에도 @Min , @Max, @Email 등을 통해 길이나 형식 등을 DTO를 검증할 수 있다. 현재 서버의 API에서 발생하는 에러는 DTO Validation에서 발생하는 에러와, Controller 이후에서 발생하는 에러, Filter에서 발생하는(JWT 검증 및..
Controller 리팩토링
·
프로젝트/COTATO.KR
SpringBoot를 활용해 Rest API를 짤 때 Controller에서 ResponseEntity를 사용해 적절한 데이터를 반환한다. 기존 프로젝트를 진행할 때 나는 아래와 같은 방식으로 진행했다. 반환형 → 와일드 카드 사용 개발 초기 반환할 값을 설계하는 과정에서 와일드 카드를 하나씩 수정하는 것이 불편하다고 생각했음 body와 서비스 메서드 분리 (인라인화 하지 않음)List 를 한줄 써서 반환할 타입을 명시하고, activeMembers 를 body에 넣어주는 방식을 사용함. 성공한 응답 코드 OK로 통일세션 추가 요청 → 200OK, 성공했지만 반환할 값 없음 → 200OK 요청이 성공했을때 200번대의 HttpStatus코드를 구분하지 않고 200으로 통일해서 사용함. @GetMappin..
유쓰응
글쓰는 개발자 Youth