글을 쓰게 된 이유 DB 접근 강의를 들으면서 네오가 키워드로 try-with-resources, AutoCloseable 를 던져주었다. 그래서 평상시에 try-with-resources를 그냥 사용하기만 했는데 이 기회에 좀 깊게 공부해보려고 한다. try-with-resources는 무엇인가요? try-catch-finally와 다르게 사용한 리소스에 대해서 명시적으로 close 하지 않아도 자동으로 close 해주는 것을 말합니다. 이펙티브 자바 아이템9 에서도 “try-finally 보다는 try-with-resources를 사용하라”는 말이 있습니다. 왜 try-with-resources를 사용해야 하는지 이번 글을 읽으면 깨달을 수 있습니다. try-with-resources는 왜 사용해야하..
객체지향적인 설계 도전 블랙잭 미션을 시작하기 전에 `객체지향의 사실과 오해(이하 객사오)`라는 책을 다 읽었습니다. 그래서 이번 미션에서는 객사오에서 읽은 "객체지향적인 설계를 최대한 실천해보자"라는 다짐을 하고 미션에 임했습니다. 패드와 칠판에 요구사항을 작성하고 분석하며, 필요한 메시지 목록들, 즉, 퍼블릭 인터페이스를 적었습니다. 그리고 해당 메시지를 처리할 수 있는 적절한 역할과 책임을 가진 객체들에게 할당했습니다. 가끔 "구현은 어떻게 하지?"라는 생각을 했습니다. 책에서는 구현 부분에 대한 것은 나중에 생각하고 먼저 메시지들을 정의하고 적절한 객체에 할당하는 게 먼저라고 했습니다. 그래서 최대한 각 기능에 따라 퍼블릭 인터페이스를 정의하고 구현하기 시작했습니다. 아래 사진은 제가 칠판에 작성..
글을 쓰게 된 이유 체스 미션을 하면서 “Optional을 메서드의 파라미터로 넣는 것은 안티패턴이다.”라는 리뷰를 받았습니다. 처음에 stackoverflow를 보고 이해되질 않았습니다. 파라미터로 넣든, Optional 을 리턴하든 똑같은 거 아닌가? 스택오버플로우에 채택된 답을 보면 아래와 같습니다. Using Optional parameters causing conditional logic inside the methods is literally contra-productive. Needing to pack an argument in an Optional, is suboptimal for the compiler, and does an unnecessary wrapping. In comparison..
이번 미션은 사다리 게임이었습니다. 우아한 테크 코스 레벨 1을 진행하면서 제 자신이 스스로 다짐한 목표가 있는데, "이전 미션들에서 받은 리뷰들을 다시 받지 않기"입니다. 그래서 최대한 자동차 경주에서 받았던 리뷰를 다시 받지 말자라는 생각을 하며 미션을 진행해 봤습니다. 이번에는 미션을 진행하면서 리뷰어 뿐만 아니라 페어와도 많은 의견을 나누면서 배웠습니다. validation은 어디에서 처리해야할까? 리뷰 링크 이 부분은 자동차 경주에서도 정리했던 내용입니다. 다만 다른 점이 있다면 자동차 경주에서는 자동차의 이름에 관한 validation으로 "원시 값 포장"을 통해서 validation 책임을 분산시켰습니다. 이번 사다리 미션에서도 마찬가지로 이름 길이 제한이 있었습니다. 자동차 경주에서의 피드..
글을 쓰게 된 이유 우테코 두 번째 미션을 진행하면서 리뷰를 기다리는 동안 다른 분들의 리뷰를 가끔 구경하러 갔다,, 그런데 "unmodifiableList를 사용하면 무조건 불변을 보장할 수 있을까요?"에 대한 리뷰였다. 나는 첫번째 자동차 미션에서 Cars 일급 컬렉션 클래스에서 List를 반환할 때, unmodifiableList를 통해 반환했다. 당연히 불변이 보장되는 줄 알고 말이다,, 그 리뷰를 보고 주섬주섬 자동차 미션을 꺼내서 테스트를 해보고 공부해 보았다. unmodifiableList 보기 description을 보면 수정 불가능한 보기를 반환합니다. 즉, 읽기 전용의 List를 반환한다는 뜻이겠지요? 수정을 시도할 경우에는 UnsupportedOperationException이 발생한..
이번 미션은 자동차 경주입니다. 많은 요구사항이 존재하진 않았지만 리뷰어님 덕분에 많이 배울 수 있었던 미션이었습니다. 정말 자바를 자바스럽게 사용하며, 객체의 "책임"과 "역할"에 대해서 많은 고민을 했습니다. 그래서 이번 Level 1 때는 제대로 완독 해보지 못한 "객체지향의 사실과 오해"를 완독 해보려고 합니다. 1차 리뷰 도메인 규칙은 어느 곳에 있어야할까?(Feat. 원시 값 포장) public Car(final String name) { this.name = name; this.distance = DEFAULT_DISTANCE_VALUE; } 요구사항에서 자동차 이름(name)은 5자 이하만 가능했습니다. 기존 Car 생성자 코드는 위와 같고, name에 대한 validation은 Input..
우테코를 시작한지 거의 2주가 됐다,, 2021년에 우테코 4기를 떨어지고 재수를 해서 이번 5기에 붙게 됐다,, 영한님 강의로 개발을 시작하기도 했고, 우형이 개발자들의 플레이 그라운드를 넓이고 선한 영향력을 많이 끼친다고 생각이 들어서 더더욱 우형에서 운영하는 교육기관인 우테코에 들어가고 싶었다. 4기에서와 다르게 5기 모집 프로세스에서는 자소서를 제출하고 4주간의 프리코스를 진행했다. 프리코스를 진행하고 자소서 + 프리코스 로 1차 합격 여부가 나왔고, 대면으로 시험을 보고 최종 합격이 결정났다. 4기에 떨어지고 나서 자바 공부를 열심히 했기도 하고, 새싹 스터디에서 프리코스와 같은 미션들을 진행했기 때문에 낯설진 않았다. 다만 재수이기에 이번에는 꼭 붙고 싶어서 매번 제출 때마다 확인하고 또 확인..
글을 쓰게 된 이유 ssg.com 인턴 프로젝트 중에 추천해요의 개수를 업데이트할 때, 사용자는 여러 번 클릭할 수 있기 때문에 클릭할 때마다 업데이트 쿼리가 나가게 되면 성능이 매우 나빠질 수 있습니다. 그래서 이를 최적화하기 위해서 중간에 캐시를 둬서 주기적으로 배치를 통해 추천해요 개수를 업데이트해주는 게 어떨까라는 생각을 하게 됐습니다. 글로벌 캐시, 로컬 캐시의 차이를 공부하고 나서 프로젝트에는 어떤 캐시 플랫폼을 적용할지 알아보도록 하겠습니다. 글로벌 캐시 vs 로컬 캐시 글로벌 캐시 글로벌 캐시는 말 그대로 여러 서버에서 global하게 사용할 수 있는 캐시를 의미합니다. 즉, 캐시 서버(ex Redis)를 두고 여러 서버들이 캐시 서버를 참조하여 캐싱을 합니다. 글로벌 캐시의 장점은 여러 ..
글을 쓰게 된 이유 동기, 비동기를 이론으로 공부하고 실제로 사용해 보아야겠다는 생각이 들어서 Spring에서는 비동기 처리를 어떻게 하는지 궁금하여 학습하게 됐습니다. 비동기 처리의 대표적인 예시 중 하나인 이메일 인증을 Spring을 사용하여 처리해 보도록 하겠습니다. dependency implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-mail' //메일 관련 의존성 implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.p..
글을 쓰게 된 이유 최근에 동시성에 관심이 생겨 DB lock을 공부했습니다. 그래서 자주 사용하는 Spring Data JPA에서는 lock 메커니즘을 어떻게 구현하고 있는지, Java는 동시성 테스트를 어떻게 하는지 궁금했습니다. 이번 글에서는 Spring Data JPA에서의 비관적 락, 낙관적 락을 어떻게 구현하는지 알아보도록 하겠습니다. 먼저 비관적 락, 낙관적 락을 잘 모르신다면 전에 공부했던 글을 참고하면 좋을 것 같습니다. dependency spring 2.7.x java 11 dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' compileOnly 'org.projectlombok:lo..
글을 쓰게 된 이유 앞서 Lock (1)에서 Database lock을 사용하는 이유와 RDB에서 통용되는 lock까지 공부해 보았습니다. 이번에는 MySQL에서 사용하고 있는 Lock에 대해서 공부해 보겠습니다. MySQL에서 사용하는 lock MySQL에서 제공하는 lock은 어느 곳에서 동작하느냐를 기준으로 mysql engine lock, mysql storage engine lock으로 나눌 수 있습니다. mysql engine lock은 global lock, table lock, named lock, metadata lock이 존재하고 storage engine lock은 innodb라 생각하고 S, X lock, intention lock, record lock, gap lock, next..
Generic vs Wildcard List list // wildcard List list // generic Generic은 타입이 정해지면 그 타입이 무엇인지 알고 그 이후에 사용하겠다는 뜻이고, Wildcard는 타입도 모르겠고, 알 필요 없으니까 뭐든 들어가도 된다라는 뜻을 가지고 있습니다. generic method, wildcard method static void method(T t) { } static void method(List list) { } static void method(List t) { } static void method(List list) { list.forEach(s -> System.out.println(s)); } @Test void genericVsWildcard..