[레벨1] 블랙잭 미션 회고록
·
우아한테크코스 7기/회고
블랙잭 미션부터 레벨 인터뷰까지 정신없는 하루하루를 보내다보니 회고글 업로드가 많이 늦어졌다 ..😓 솔직히 말하자면 블랙잭 미션은 다른 미션에 비해서 인사이트를 얻은게 크게 없다보니 이번 포스팅은 짧게 작성하고 마무리하려고 한다.그 대신 이후에 업로드할 글들(장기 미션, 레벨 인터뷰, 레벨1 회고 ...)에서 더 많은 내용을 기록할 계획이다. Pull Requests1단계https://github.com/woowacourse/java-blackjack/pull/831 [1단계 - 블랙잭] 밍곰(박민선) 미션 제출합니다. by minSsan · Pull Request #831 · woowacourse/java-blackjack체크 리스트 미션의 필수 요구사항을 모두 구현했나요? Gradle test를 실..
[레벨1] 출석 미션 회고록 그리고 TDD
·
우아한테크코스 7기/회고
이번 미션에서는 크루 출석 관리 애플리케이션을 구현해야 했다.출석 미션은 이번 우테코 최종 코테 문제로 출제됐던 문제다!ㅠㅠ  특히 위와 같은 추가 요구사항이 눈에 띄었다. 바로 TDD를 적용해서 진행하라는 것! 프리코스때도 TDD를 적용했었는데, 지금 다시 생각해보면 TDD가 아닌데 TDD를 적용한줄 착각했던 것 같다..ㅎ..프리코스때는 '그냥 테스트 코드랑 같이 작성하면 TDD 아니야?' 라고만 생각했는데, 이번 출석 미션에서 TDD를 맛보고 나니 TDD를 잘못 이해하고 있었음을 깨달았다. TDD가 뭔가요출석 미션을 시작하기에 앞서 네오 코치님이 TDD에 대해서 설명해주셨다.강의에서 새롭게 얻은 인사이트는 다음과 같다!TDD는 처음부터 완벽한 설계를 하는 것이 아니라, 점진적으로 설계를 해나가는 것 ..
[레벨1] 로또 미션 회고록 + 학습 내용 정리
·
우아한테크코스 7기/회고
첫 번째 java 미션은 프리코스 때도 진행했던 로또 문제였다.페어 프로그래밍을 처음 해봐서 스스로 부족했던 부분들이 많았던 것 같다ㅜ👀 미션 진행 방식첫 미션이다보니 미션 진행 방식이 어렵게 느껴졌다.일단 미션은 두 단계로 나뉜다.1단계https://github.com/woowacourse/java-lotto/pull/579 페어 프로그래밍으로 진행한다. 페어와 네비게이터 / 드라이버 역할을 번갈아서 맡으며 코드를 작성한다.처음에는 제한 시간을 따로 정하지 않고 진행했는데, 하다보니 좋은 방법이 아닌 것 같아서 20분 타이머를 맞춰놓고 알람이 울리면 현재 진행중인 기능까지 완료한 다음에 넘기는 방법으로 바꿨다. 로또 피드백 과정에서 페어 프로그래밍 진행 방식에 대해서도 질문이 나왔는데, 코치님은 제한..
[Java+Spring] 동시성 문제와 synchronized
·
backend/java
이번 포스팅에서 알아볼 문제는 동시성 문제입니다. 오늘은 동시성 문제에 대해 간략하게 설명하고, 자바에서 synchronized를 활용하여 동시성 문제를 해결하는 방식을 알아보고자 합니다.뒤에서 언급할테지만 이 방식은 단순히 '여러 스레드의 동시 접근을 막는 방식'이기 때문에 프로세스 내에서만 유효하다는 단점이 있다.즉, 다중 서버(Scale Out)로 운용하는 서비스에서는 synchronized를 사용하더라도 동시성 문제를 해결할 수 없다. 따라서 데이터베이스에 락을 걸어 동시 접근을 차단하는 방식이 더 적합할 수 있다.이와 관련해서는 추후 DB Lock 포스팅을 작성하여 정리하고자 한다. 동시성 문제동시성 문제란, 하나의 자원에 여러 스레드가 동시에 접근하여 데이터 정합성이 지켜지지 않은 것을 의미합..
[객체지향] SOLID 원칙 이해하고 적용하기(+ 일급 컬렉션)
·
backend/CS
최근 소셜 로그인 구현 코드를 리팩토링하는 과정에서 SOLID 원칙을 조사하고 적용해보았습니다. 따라서 이번 포스팅에서는 SOLID 원칙 설명과 리팩토링 과정을 정리하고자 합니다. 💡 배경 & 문제 인식이전에 소셜(카카오) 로그인 API를 서버측에 구현했는데, 문득 서비스에 새로운 소셜 로그인이 추가될 경우 현재 코드 설계는 적합하지 않다고 판단했습니다. 그 근거는 아래와 같습니다. 위의 UML 클래스 다이어그램은 기존 카카오 소셜 로그인 기능의 설계 구조입니다. 우선 소셜 로그인에 사용되는 객체가 모두 구현체로 정의되어 있는 것을 확인할 수 있습니다. 즉, 만약 서비스에 새로운 소셜 로그인이 추가되는 경우에 해당 소셜 로그인에 알맞는 컨트롤러 구현체, 서비스 구현체를 그때그때 구현해야 한다는 것입니다..
[Spring] N+1 문제 알아보기
·
backend/spring
이번 방학부터 자바 Spring을 학습하면서 프로젝트에 내용을 하나씩 적용해보고 있는데, 이 과정에서 첫 번째로 마주친 문제는 N+1 문제이다. 이번 포스팅에서는 N+1 문제가 무엇이며 왜 발생하는지를 알아보고, 이를 해결하기 위한 방안들과 그 중에서 어느 해결법을 적용했는지 기록하고자 한다. 📋 문제 상황 현재 프로젝트에서 Scrap 객체와 Dataset 객체는 아래와 같이 다대일 관계를 갖고 있다. // domain/Scrap.java @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor public class Scrap { // ... @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "da..
[Web] JWT 로그인
·
web
프로젝트에서 로그인 기능을 구현하면서 막혔던 부분들과 해결 과정을 기록하기 위해 포스팅을 작성했다. 특히 프론트 배포 서버 도메인과 백엔드 배포 서버 도메인이 서로 달랐기 때문에 여러 문제점에 부딪혀볼 수 있었다. 🔐 Session vs JWT Session 처음에는 session id를 통해 로그인 기능을 구현하려 했다. 그 이유는 stateless한 HTTP 통신 특성상 클라이언트의 로그인 상태를 확인하기 위해서는 쿠키를 활용해야 하는데, session id 값에는 유저 정보가 담겨있지 않으므로 보안상 이점이 더 많다고 생각했기 때문이다. 하지만 토큰 값에 유저 정보를 담지 않는 대신, 서버측에서 각 브라우저의 세션 id 정보 및 클라이언트 정보를 직접 관리해야 하므로 서버 파트의 부담이 더 커질 수..
[백준][C++] 11000번 - 강의실 배정
·
algorithm
문제 링크 11000번: 강의실 배정 첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109) www.acmicpc.net 풀이 과정 먼저 시간복잡도를 확인해보았다. 시간 제한이 1초, N의 최댓값이 200,000 → N^2 = 40억 (대략 40초) 이기 때문에, 한 강의 시간을 살펴볼 때마다, 다른 강의 시간을 모두 탐색하는(브루트포스) 방법은 적절치 않을 것이라는 전제하에 코드를 작성하였다. 그리고 각 강의실에서 진행되는 모든 강의들 중, 가장 일찍 끝나는 시간을 알아내기 위해서 각 강의실에서 강의가 끝나는 시간의 정렬이 필요했다. 이 경우에는 시간이 새로 입력될 때마다 곧바로 정렬이 이뤄져야했기 때문에 최소 힙을 ..