전체 글 (45) 썸네일형 리스트형 [COTATO.KR] 웹소켓에 퀴즈에 대한 정보를 넣어야 할까? 코테이토 내 실시간 선착순 문제풀이 서비스를 개발한 지 1년 정도 됐다. 웹소켓을 활용해 관리자가 버튼을 클릭할 시 실시간으로 접속한 사용자들에게 동시에 문제 풀이가 가능하게 했다. 하지만 현재 웹소켓 전송 로직을 바꿀까 고민중에 있어 글을 정리하고자 한다. 현재 선착순 제어 로직은 다음과 같다.관리자가 접근 버튼을 누른다.웹소켓을 이용해 접속한 모든 사용자에게 해당 퀴즈 pk가 넘어간다. 문제의 데이터는 보내지 않는다.사용자는 웹소켓으로 받은 퀴즈 pk를 Body에 넣어 퀴즈의 정보를 받는 API를 쏜다.해당 로직은 장단점은 다음과 같다.장점웹소켓을 통해 적은 메세지만 보내므로 모든 인원이 비슷한 시기에 버튼을 받을 수 있다.단점웹소켓 → API → 랜더링의 과정을 겪으므로 시간이 오래 걸린다.API(.. 개발자가 되기 위해 바뀐 점과 바뀌고 싶은 점 오늘은 평소 드는 생각을 글로 정리해볼까 한다. 글을 잘 쓰는 편은 아니라서 굉장히 두서 없을 수 있다.하지만 내 생각을 잘 전달하는게 오늘의 목표기 때문에 정늘은 평소 드는 생각을 글로 정리해볼까 한다. 글을 잘 쓰는 편은 아니라서 굉장히 두서 없을 수 있다. 하지만 내 생각을 잘 전달하는게 오늘의 목표기 때문에 정갈하게 적어볼까 한다. 눈떠보니 개발자학생 시절에는 개발자라는 직업에 대해 잘 알지도 못했고, 알고 있었다 해도 딱히 흥미가 없었을 것 같다.그 때까지만 해도 굉장히 시니컬하고 혼자 노는거 좋아하는 사람들이 해야하는 직업이라 생각했다.개발자가 개발와 더불어 커뮤니케이션이 중요한 줄 몰랐던 그 당시에는 사람들 만나서 이야기하고 다양한 사람들 만나서 노는거 좋아하는 나 같은 사람은 할 수 없는 .. [K6 테스트] websocket 발전을 위한 성능 테스트 프로젝트에서 websocket을 이용한 선착순 문제풀이가 존재한다. 현재 방식은 websocket에서 퀴즈 상태(현재 상태), 명령어(command), 퀴즈 아이디만 소켓을 통해 프론트로 메세지를 보낸다. 해당 메세지를 받은 프론트는 1번 퀴즈를 status(공개) 하고 문제풀이(start)는 허용하지 않은 화면을 반환한다. 프론트에 소켓 메세지가 도착하면 프론트에서/quiz/{quizId} http 요청을 통해 해당 퀴즈 정보를 가져오는 두 단계 방식으로 진행된다. 기존에는 문제의 정보를 전체 다 넘겨주려고 했다. 하지만 당시까지는 개발한 소켓은 불안해 최대한 안정적으로 메세지를 보내기 위해 quizId만 보내기로 했다.하지만 프로젝트 V2에 들어서면서 소켓 안정성이 향상돼 많은 데이터도 안정적으로.. Multipart/form-data convert(역직렬화) 오류 해결 프로젝트를 진행하다 file과 속성 값이 같이 있는 DTO를 swagger에서 백엔드 넘기는 상황에 직면했다. 이 때 중첩된 DTO를 사용할 때 convert 오류가 발생한다.record request(String placeName,@NotNull LocalDate sessionDate,@Valid @NotNull AttendanceDeadLineDto attendanceDeadLine)cannot convert value of type 'java.lang.string' to required type dto 헤당 문제는 중첩된 DTO를 사용할 때 swagger에서는 form-data 상태에서 중첩된 DTO를 객체가 아닌 String으로 인식한다. 따라서 AttendanceDeadLineDto를 객체를 받.. 위상정렬 알고리즘(Topology Sort) 위상정렬 알고리즘은 순서가 정해진 작업을 차례로 수행해야 할 때 사용한다. 순서의 일부만 나타낸 list를 가지고(graph의 edge와 같이) 전체 순서를 찾는 방식이다.위상정렬 알고리즘의 가장 중요한점은 제일 처음에 있는 head는 자신을 가르키고 있는 노드가 없다는 점이다 이게 무슨 말이냐 다음과 같은 그래프가 있을 때 자신을 가르키는 노드(진입차수)가 없는 노드는 1번 뿐이다. 따라서 다음 그래프의 시작점은 1인 것이다. 따라서 각 노드의 진입차수를 표로 관리한다. 따라서 시작점은 1번인 것이다. 1번이 시작이면 이제 1번 노드를 삭제하고 진입차수를 다시 계산한다.정확히 말하면 다시 계산이 아닌 1번 노드와 연결된 노드들을 1씩 빼는 것이다. 이 때 진입차수가 0인 노드가 다음 순서이다.이런식으로.. 백준 7453 Java (int[] 와 List의 차이) https://www.acmicpc.net/problem/7453 문제를 풀면서 그 전문제에 투포인터로 시간 복잡도를 낮출 수 있는 방법을 배워 그것을 활용해 풀었다. 하지만 시간 복잡도가 아직도 컸다. 최초 코드를 보면서 분석해보자public class Main { static long count; static int[] A, B, C, D; static int N; static List AB, CD; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTok.. 백준 2133 오답풀이 https://www.acmicpc.net/problem/2133난이도: 골드4 해당 문제는 DP 문제로 생각보다 생각해야할 문제들이 많은 문제였다. 최초에 생각한 방식은 dp[6]이면 dp[4]와 dp[2]를 곱하고 둘의 순서가 바뀔 수 있으므로 2를 곱하면 될줄 알았다.하지만 dp[4] 안에는 dp[2] dp[2]의 배열이 있기 때문에 중복되는 값이 존재한다는 점이었다. 따라서 dp[4]에만 있는 모양을 따로 빼기로 마음 먹었다. 모든 dp에는 나누어 떨어지지 않는 모양이 2개 존재한다. 따라서 dp[i-2] * dp[2]를 한 뒤 dp[i]에 나눠 떨어지지 않는 2가지 경우만 * 2를 해줬다 + dp[i]에만 존재하는 2개 결과적으로 아래와 같은 점화식을 세웠다dp[i] = (dp[i - 2] + .. [문법] int 배열의 stream 기존 List와 달리 int 배열은 배열.stream이 안된다.그럼 어떤식으로 stream 문법을 사용해야할까. 그 방법은 Arrays 라이브러리에 존재한다. Arrays.stream(배열)을 하면 IntStream으로 바꿔준다. 그것을 활용해 다양한 메소드를 사용할 수 있다. ex)Arrays.stream(dp).max()주의점: 해당 return 값은 int가 아닌 OptionalInt를 반환한다. stream 안에 아무 값이 없을 수 있으니까. 따라서 getAsInt()를 통해 Optional을 벗겨줄 수 있다. boolean b = Arrays.stream(dp).allMatch(value -> value > 5);또한 allMatch를 통해 안에 모든 값이 5보다 큰지 확인할 수도 있다. 이전 1 2 3 4 5 6 다음