본문 바로가기

분류 전체보기

(89)
Java HashMap 의 동작 원리 (Java 8 이상에서) Map 은  key - value 쌍으로 데이터를 저장하기 위한 자료구조이다.HashMap은 Map의 구현체 중 하나로, 기본적인 아이디어는 다음과 같다. Map은 Key를 통해 Value에 접근할 수 있어야 한다.Key를 해싱해 배열의 index로 사용하고, 거기에 Value를 두면 되지 않을까?이 아이디어를 구현하기 위해, HashMap은 객체의 hashCode() 값을 사용하여 Key를 배열의 index에 매핑한다.  HashMap이 Key를 index로 매핑하는 법HashMap은 객체의 hashCode() 값을 사용한다.HashMap은 Key를 배열의 index로 매핑시키기 위해 객체의 hashCode() 값을 length와 함께 연산해 index를 구한다.왜 해시값에 length를 사용한 추가 ..
우아한테크코스 7기 백엔드 최종 합격 후기 우아한 형제들에서 운영하는 개발자 교육 프로그램인 우아한테크코스 7기에 웹 백엔드로 합격했다.지원하기부터 1차, 최종 합격까지의 과정을 정리해보고자 한다. 우아한테크코스를 지원한 이유최근 1년 동안 나는 프로그래밍을 혼자 공부해 왔다.멋쟁이사자처럼 12기 서버파트장을 하며 얻은 것들도 많았지만, 아무래도 실력적으로 성장하는 데에는 한계가 있었다. 혼자 서버 파트를 책임지다 보니 프로젝트를 하는 데에 있어서 백엔드적인 의사결정을 전부 혼자 해야 했다. 이 과정에서 나름대로 장단점을 비교한다거나, 다른 좋은 해결책은 없는지 고민했다. 하지만, 함께 걸어가는 동료가 없다는 것이 아쉬웠고 내 지식과 의사결정이 올바른가에 대한 확신을 가질 수 없었다. 이 부족함을 채우기 위해 우아한테크코스의 프로젝트 레포지토리..
RestInterceptor 개발기 - build() 메서드 제거와 v1.0 릴리즈 RestInterceptor 가 뭐지?  ->  https://dev-allday.tistory.com/90 기존에 아쉬웠던 점들과 사용성을 개선해 1.0 버전을 릴리즈했다.UML 가장 큰 변화 - build()가장 큰 변화는 RestInterceptorRegistry를 통해 RestInterceptor를 등록할 때 반드시 호출해야 했던 build() 메서드가 사라졌다는 것이다. 기존에 RestInterceptorRegistry는 RestInterceptorRegistry 리스트를 필드로 가지고 있다가 build() 메서드가 호출되어야만 RestInterceptor의 설정들을 실제 InterceptorRegistry로 반영했다.@Configuration@RequiredArgsConstructorpubli..
RestInterceptor 개발기 - 패턴 매칭 이슈 문제점RestfulPatterns는 match() 시 자신의 Path와 HttpMethod에 해당하는 HTTP Request에 true를 반환해야 한다.기존에는 RestfulPatterns 가 UriTemplate 을 사용하도록 개발했다.public class RestfulPattern { private final UriTemplate path; private final Set methods; private RestfulPattern(final UriTemplate path, final Set methods) { this.path = path; this.methods = methods; } ...}  하지만, 테스트 코드를 작성하는 과정에서 Ur..
Spring 라이브러리 개발기 - RestInterceptor v0.1 개발 배경 Spring 을 사용해 Restful api 서버를 개발하다 보면 Interceptor 를 사용할 때가 있다. Interceptor 를 구현하기 위해 보통 HandlerInterceptor 의 구현체를 구현하게 되는데, 여기엔 두 가지 단점이 있다. 1. CORS 에서 사용되는 Preflight 요청도 Interceptor 를 통과하게 된다. 그러므로, Preflight 요청은 전부 허용하도록 인터셉터 내부에 코드를 넣어야 한다.2. HandlerInterceptor 는 URI 를 기반으로 등록해야 한다. 하지만, Restful api 에서는 URI 와 HTTP Method 를 통해 요청을 구분한다.ex) GET /memos 와 POST /memos 는 다른 요청이다. 그러므로 POST /m..
11월 26일 회고 Keep - 잘하고 있는 점. 계속 했으면 좋겠다 싶은 점Keep1 - JVM 공부 프리코스에서 자바에 대한 기본기가 많이 부족하다는 것을 느꼈다. List, Collection, equals 등의 개념이 대표적이었는데, 내가 무언가를 잘 알지 않는 상태에서 사용하는 것은 프로그램에 좋지 않은 영향을 미칠 것이라 생각했다.  자바에 대해 깊게 알아야 Spring 을 더 잘 할 수 있다고 생각해 JVM 에 대해 공부했다. JVM 을 공부하며 자바 프로그램의 실행 과정, 실행 중 동작, GC 의 수행 과정을 알 수 있었다. 아직 JVM 을 전부 공부한 것은 아니다. JVM 은 생각보다 복잡하고 어려운 개념이었다.  JVM 을 계속해서 공부하며 순수 자바에 대한 이해도를 쌓아가고자 마음먹었다.  Keep2 -..
7기 프리코스 4주차 회고 (KPT 회고) Keep - 잘하고 있는 점. 계속 했으면 좋겠다 싶은 점Keep1 - VO 사용 VO 를 사용하며 원시값을 포장함과 동시에 해당 값만의 역할을 분리할 수 있었다. 처음 VO 를 접했을 때에는 원시값을 클래스로 한번 더 포장하는 것을 잘 이해할 수 없었지만, 직접 사용해보고 장점과 단점을 분석해보니 VO 를 사용하는 것이 더 좋은 방법이라는 결론을 내릴 수 있었다. VO 의 장점1. 자료형에 의미를 부여할 수 있다. - 자료형이 의미 있는 이름을 가지게 되기 때문이다.2. 타입 안정성을 높일 수 있다. - 같은 int 자료형이더라도, 각각의 VO 로 다루게 되면 검증이 적절히 수행되기 때문이다.3. 최소한의 데이터 검증의 책임을 분리할 수 있다. - VO 내부에서 검증을 수행하기 때문이다. VO 의 단점..
7기 프리코스 3주차 회고 (KPT 회고) 3주차 프리코스를 진행하는 과정에서 내가 올바른 방식으로 회고를 하고 있는지에 대한 의문이 들었다.  지금까지 나는 회고를 위해 메타인지를 하는 과정에서 내가 안다고 생각했던 것과 고민했던 점들, 의사결정 이유만을 정리하고 있었다.  이것들을 정리하는 과정에서 앞으로의 계획이나 내가 부족했던 점을 잘 정리하고 있지 않은 것 같다는 생각이 들어 우선 "회고" 란 무엇인지 찾아보기로 마음먹었다.  회고란?지난 일을 순서대로 정리하고, 방식을 복기하면서 아쉬운 점과 앞으로 적용할 수 있는 점들을 기록하는 것.  제대로 된 회고를 하기 위해 나는 KPT 회고 템플릿을 사용해 회고록을 작성하기로 마음먹었다.KPT 회고 템플릿이란?Keep : 잘하고 있는 점. 계속 했으면 좋겠다 싶은 점.Problem : 뭔가 문..
7기 프리코스 2주차 회고 평소 제대로 알고 사용하고 있는 개념이 많지 않다는 사실에 놀랐다. 그동안 프로젝트를 완성하는 것에만 집중하고, 기본기에는 소홀했다는 점을 깨닫고 반성하는 시간을 가질 수 있었다.  안다고 생각했던 것과 몰랐던 것1.  방어적 복사 - List.copyOf() 와 Collections.unmodifiableList() 이 부분은 글을 하나 새로 써야 할 정도로 양이 많다. 알고 있던 개념1. 방어적 복사는 복사본을 만들어 반환하는 것이다.2. List.copyOf() , Collections.unmodifiableList() 를 사용하면, 방어적 복사가 수행되면서, 복사본 List 를 수정할 수 없게 만든다.    몰랐던 개념 지금까지 List.copyOf() 와 Collections.unmodifiab..
7기 프리코스 1주차 회고(알고 있다고 생각했던 것들) 1주차 프리코스를 진행하며 아는 것과 모르는 것을 구분하는 법을 배울 수 있었다.평소 알고 있다고 생각하고 사용했던 개념들에 대해 꼬리질문을 하니 대답할 수 없던 경우가 많았다. 과제를 진행함에 있어 내가 알고 있다고 생각했지만, 몰랐던 것들에 대해 정리를 해 보고자 한다.    1. 자바의 record 클래스알고 있던 개념1. record 는 단순히 값을 저장하는 용도의 클래스가 필요할 때 사용하는 클래스 타입이라는 점.2. 내부 변수를 얻기 위해선(get), 변수명과 동일한 메서드로 접근하면 된다는 것(ex. record.value()).  더 조사하게 된 계기1. 불변 객체를 만들기 위해 record 클래스를 만들고, 변수에 private final 을 붙였다. 하지만, 문법 오류가 발생했다. 2...