전체 글

😼 Github : https://github.com/Mingyum-Kim
우아한테크코스/레벨0

[회고] 우아한테크코스 1차 심사 합격 + 앞으로의 계획

💎 1차 심사 합격 시간이 흘러 어느덧 12월 12일이 되었고, 그동안 공들여왔던 나의 자기소개서와 프리코스를 기반으로 코딩 테스트 대상자가 선정되는 날이다. 사실 이 날 졸업 프로젝트 발표가 있어서 발표에 신경쓰느라 조금 까먹고 있었는데, 발표가 가까워지자 심장이 막 두근거렸다. 3시가 되어 학교에서 근로하다가 화장실에 가서 얼른 확인해보았는데, ㅠㅠ 감사하게도 합격이었다. 나보다 잘하는 사람들은 아주 많았지만, 그 중에서도 내가 1차에 합격하게 된 것은 자기소개서의 비중이 크다고 생각한다. 글솜씨가 좋은 편이 아니라 지원 폼이 열리기 이전부터 미리 작성해보고, 주변 사람들에게 첨삭을 받으며 애를 쓴 결과인 것 같다. 나는 사실 프리코스로도 밤낮없이 많은 시간을 투자하였면서 많이 성장할 수 있었기 때문..

우아한테크코스/레벨0

[회고] 우아한 테크코스 프리코스 1주차 회고 - 숫자 야구 게임

많이 늦어버린 1주차 회고이다. 😅 1주차 때는 회고라는 것을 쓸 정신도 없이 미션에 적응하기 바빴고, 프리코스가 끝나고 다시 1주차를 회고하는 것도 괜찮겠다는 생각이 들어 미루고 미루다 이제서야 쓰게 되었다. 최근에는 프리코스가 끝나고 미뤄왔던 업무를 쳐내고 있고, 혹시라도 코딩 테스트를 응시하게 될 경우를 대비해 우아한 테크코스 코딩 테스트 스터디를 진행하는 중이다. 1주차 회고를 작성하기 위해 1주차 때 기록헀던 것들을 보고 있자니, 했던 고민들이 굉장히 귀엽다 ,,? 는 느낌이 든다. 이 시기에는 자바 컨벤션도 모르고, 어떻게 커밋 메세지를 남겨야할 지, 어떻게 함수 분리를 할 지 몰랐기에 했던 고민들이 굉장히 기초적일 수밖에 없었던 것 같다. 지금 생각하면 당연한 것들도 이때는 하나의 고민 거리..

우아한테크코스/레벨0

[회고] 우아한테크코스 프리코스 4주차 회고 - 크리스마스 프로모션

대망의 4주차 미션이 끝이 나면서, 프리코스를 마무리하게 되었다. 🤗🤗🤗 마지막 주차 미션은 다른 주차와 다르게 난이도가 많이 높았고, 비공개 저장소에서 구현하는 시스템 하에 미션을 구현하게 되었다. 보통 미션을 구현하기 위해서 하루 이틀을 설계하는 것에 사용하고, 나머지 시간을 구현하고 리팩토링하는 것에 시간을 썼다. 그러나 이번 미션에서는 요구 사항이 복잡하고 객체의 역할과 책임을 분리하는 것이 어려워서, 설계를 하는 것에만 거의 3일 넘게 썼다. 그래서 실제 구현한 기간은 3일 남짓 정도 밖에 안되었지만, 오래 고민하고 설계한 덕분에 구현 과정에서는 설계 자체에 대해서는 머리를 싸매지 않고 순조롭게 개발할 수 있었다. 미션을 구현할 때마다 늘 새로운 부분을 배우고 적용하는 경험을 하였다. 특히 이번..

우아한테크코스/레벨0

[회고] 우아한테크코스 프리코스 3주차 회고 - 로또 게임

2023.11.01 - [Other/기록] - [회고] 우아한테크코스 2주차 회고 - 자동차 경주 게임 [회고] 우아한테크코스 프리코스 2주차 회고 - 자동차 경주 게임 이번 과제에서는 1주차의 코드에 대해서 피드백을 받은 내용을 최대한 반영하고자 노력하였다. 새로 추가된 요구 사항에 나와있는 것처럼 indent depth가 3이 넘지 않도록 구현하기 위해 함수를 최 mingyum119.tistory.com 이번 주차에는 '로또 게임' 이라는 미션이 제시되었다. 문제 자체는 간단한 것 같은데, 지난 주차와 다르게 에러 메시지를 출력하고 다시 입력을 받아야한다는 점, Enum Type으로 로또 당첨의 등수를 표현한다는 점이 구현하기 어려웠다. 또한 함수의 길이가 15라인으로 제한되고, 단위 테스트에 대한 ..

우아한테크코스/레벨0

[회고] 우아한테크코스 프리코스 2주차 회고 - 자동차 경주 게임

이번 과제에서는 1주차의 코드에 대해서 피드백을 받은 내용을 최대한 반영하고자 노력하였다. 새로 추가된 요구 사항에 나와있는 것처럼 indent depth가 3이 넘지 않도록 구현하기 위해 함수를 최대한 작게 만드는 일에 집중하였다. 1주차 때 느꼈지만 함수를 세분화한다는 것은 생각보다 쉽지 않다. 함수화할 수 있다고 생각치 못한 부분에서 관련된 피드백을 많이 받았던지라, 이번 과제에서는 그러한 부분을 많이 신경쓰며 개발하고자 하였다. 2주차 프리코스 저장소는 아래 링크에 있다. https://github.com/woowacourse-precourse/java-racingcar-6 GitHub - woowacourse-precourse/java-racingcar-6 Contribute to woowaco..

Framework/Spring

[SpringBoot] @RedisHash를 이용한 Spring Data Redis Repository 적용기

Redis란? Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템 (DBMS)이다. 데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소이다. String, List, Sets, SortedSets, Hashes 자료 구조를 지원하며 데이터를 디스크에 쓰는 구조가 아닌 메모리에서 데이터를 처리하기 때문에 속도가 빠르다. Spring Boot에서 Redis 사용하기 Spring Boot에서 Redis 인메모리 저장소를 사용하는 것에는 2가지 방법이 있다. RedisTemplate String refreshToken = jwtTokenProvider.createRefreshToken(); ValueOperatio..

DEV book/토비의 스프링 3.1

[토비의 스프링 3.1] 3장 템플릿 (3) - 템플릿과 콜백

이전 포스팅에서 알아본 UserDao와 JdbcContext, StatementStrategy의 구조는 템플릿/콜백 패턴과 관련이 있다. 템플릿/콜백 패턴 바뀌지 않는 일정한 패턴을 갖는 작업 흐름 ( = 템플릿) 이 존재하고 그 중 일부분을 변경해야하는 전략 패턴 구조에 익명 내부 클래스 ( =콜백)을 활용한 방식을 의미한다. 두 가지 용어에 대해서 조금 더 알아보자. 템플릿 (template) : 어떤 목적을 위해 만들어 둔 고정된 로직(틀)이다. 템플릿 메소드 패턴은 바뀌지 않는 템플릿 메소드를 상위 클래스에 두고, 바뀌는 부분을 서브 클래스의 메소드로 오버라이딩하는 구조를 가지고 있다. 콜백 (callback) : 실행되는 것을 목적으로 다른 오브젝트에 전달되는 오브젝트를 의미한다. 메소드가 담긴..

DEV book/토비의 스프링 3.1

[토비의 스프링 3.1] 3장 템플릿 (2) - JdbcContext를 UserDao에서 사용하는 두 가지 방법

이전 포스팅에서, UserDao의 코드에서 예외처리 구문을 추가하고, 디자인 패턴을 이용해 각 테스트 코드에서 쿼리문을 실행하는 PrepareStatement 객체를 생성하는 작업을 최적화하였다. 변하는 부분을 메소드로 추출한 메소드 추출 기법, 추상 메서드를 오버라이딩하는 템플릿 메소드 패턴, 그리고 인터페이스를 생성하여 각각의 PrepareStatement 생성 방법마다 구현 클래스를 만드는 전략 패턴을 고려하였다. 전략 패턴에서 테스트 메소드 안에 직접적으로 구현 클래스가 결정되는 현상을 막기 위해서 컨텍스트 코드를 분리하고, 테스트 메소드는 하나의 클라이언트로 작동하도록 하였다. 즉 DI를 사용해 클라이언트 (UserDao) 와 컨텍스트 (jdbcContextWithStatementStrategy..

DEV book/토비의 스프링 3.1

[토비의 스프링 3.1] 3장 템플릿 (1) - 디자인 패턴과 DI를 이용한 DAO 최적화

앞서, 초난감 DAO 중에서 변경이 자주 일어나는 부분과 고정된 부분에 대해 효과적으로 활용하기 위한 리팩토링을 진행해보았다. 템플릿이란, 이렇게 서로 다른 부분에서 변경이 거의 일어나지 않는 부분을 자유롭게 변경되는 성질을 가진 부분으로 독립시켜 효과적으로 활용할 수 있게 하는 방법이다. UserDao 예외 처리 기존에 작성하였던 UserDao는 예외처리 구문이 빠져있다. JDBC 코드에서는 어떤 상황에도 정상적으로 리소스를 반환하도록 try/catch/finally 구문을 사용할 것을 권장한다. 기존에 작성하였던 deleteAll 함수를 보자. public void deleteAll() throws SQLException { Connection c = dataSource.getConnection();..