finalfinal : 값의 재할당을 막는다(불변과는 다르다)(ex. List 의 경우 final 선언을 해도 값이 변할 수 있다) 보통 service 클래스를 주입받아서 사용할 때 final 을 자주 접하였을 텐데, 함수 파라미터 앞에는 왜 final 을 붙이는 걸까? 매개변수의 재할당 금지매개변수의 재할당을 금지하기 위해서이다 예를 들어보자 int plusMethod1(int x) { x = x + 10; return x; } int plusMethod2(final int x) { // 매개변수의 재할당 금지 int result = x + 10; return result; } plusMethod1( ) 은 매개변..
Java
record 란?기존 코드package number.study;import lombok.Getter;@Getterpublic final class practice { private final String name; private final int age; public practice(String name, int age) { this.name = name; this.age = age; }} record 사용 코드package number.study;public record practice(String name, int age) {} 레코드를 사용하면 위의 코드가 아래의 코드로 변하게 된다 레코드는 보일러 플레이트 코드를 제거하기 위해 등장했다(위의 클래스..
의존관계 역전의 법칙 (Dependency Inversion Principle)1. 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.2. 추상화는 세부사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다. 의존관계 역전의 법칙을 잘 적용하게 되면 우리는 하위 모듈의 변경에 의해 상위 모듈이 영향을 받지 않도록 구현할 수 있다 단순 '추상화에 의존해야 한다'로만 DIP 를 이해해서는 안된다'상위 모듈은 하위 모듈에 의존해서는 안된다' 라는 내용 역시 적용해야 진정한 DIP 를 적용하는 것이라 할 수 있다 그렇다면 과연 상위 모듈과 하위 모듈이 뭘까? 모듈모듈이란 전체 소프트웨어 시스템을 작은 단위로 쪼개 놓은 것,작은 단위로 서로 긴밀하게 연관관계가 ..
@Datapublic class Member { private Long id; private String name; private int age;} 우리가 자주 마주하는 코드들이다 그런데 우리가 자주 보는 이 코드들이 항상 id 값(보통 PK) 의 타입을 long 이 아니라 Long 으로 주는 것을 알 수 있다 왜 굳이 Wrapper 클래스인 Long을 사용하는 걸까 그에 대한 이유는 null을 사용할 수 있기 때문이다 만약 id 필드의 타입을 long 타입으로 설정한 경우 id 의 default value 는 0이 된다id 의 기본값이 0 이라는 것은 문제를 초래한다id 에 '값을 선언하지 않아서 0인 경우'와 '값을 0으로 선언한 경우' 를 구분할 수 없게 된다 하지만 Wrapper ..

https://khan-0103.tistory.com/24 Reflection 으로 JDBC Template 구현해보기 (행복 ver)데브코스 백엔드 1기 첫번째 팀 프로젝트(토이 프로젝트지만..)를 진행하게 되었다 대충 주제는 'JDBC 를 이용해서 간단한 프로젝트 만들기!' 였다 결국엔 JDBC우리가 ORM 기술을 사용하든 SQL Mapperkhan-0103.tistory.com 여기서 만든 JDBC Template 조무사를 팀 토이 프로젝트에 적용해보았다 처음엔 설렘 반, 두려움 반이었으나 30분정도가 지나고 난 후 절망 99% 로 바뀌게 되었다 내가 만든 Utility 클래스(쿼리를 객체로 맵핑, 삽입) 에는 여러가지 문제점이 있었다 내가 느끼기에 치명적이었던 문제 순서대로 설명하겠다 1. E..
데브코스 백엔드 1기 첫번째 팀 프로젝트(토이 프로젝트지만..)를 진행하게 되었다 대충 주제는 'JDBC 를 이용해서 간단한 프로젝트 만들기!' 였다 결국엔 JDBC우리가 ORM 기술을 사용하든 SQL Mapper 기술을 사용하든 결과적으로 JDBC 에 쿼리를 보내주는 것은 동일하다. 우리가 직접 보내느냐 저런 기술들을 거쳐서 보내느냐 정도의 차이이다. 따라서 JDBC 에 대해서 알고가는 것이 백엔드 개발자로서의 사명감이라고 생각을 한다. (물론 지금 우리가 직접 JDBC 만 이용해서 코딩하진 않지만) SQL Mapper 와 ORM 기술이 탄생한 이유이번 데브코스 첫 토이 프로젝트는 개발자들의 역사를 직접 체험해보는 시간이라 정말 감명깊었으나 JDBC 를 한번도 사용한 적이 없기에 이러한 코딩은 엄청난 ..
Primitive Obsession-> 원시타입 강박코드가 Primitive Type(원시 타입)에 너무 많이 의존할 때를 말한다도메인의 객체를 나타내기 위해 primitive type 을 사용하는 것을 피해야 한다 원시타입 강박을 해결하는 방법들과 그로인해 얻게 되는 이점은 무엇이 있는지 알아보자 원시값 포장코드를 먼저 보고 이해해보자 원시값 포장 적용 전public class Student { private String name; private int score; public Student(String name, int score) { if (score 100) { // name 에도 조건을 걸어버리는 경우 더욱 복잡해진다 throw new Il..
사실 원래 주제는 CompletableFuture 였는데 Future 의 get( ) 과 CompletableFuture 의 get( ) 을 각각 돌려보면서 정말 신기한 점을 발견해서 주제를 바꾸게 되었다. 간단히 요약하면 Future.get( ) 과 Completable.get( ) 은 완전히 다르다!!! 일단 차근차근 비동기가 무엇인지부터 시작하자 비동기 처리멀티 스레드 상황에서 스레드들은 각자의 코드를 각자의 페이스대로 수행한다. 특정 시점에서 어떤 스레드가 먼저 실행되는지는 알 수 없으며 공유자원에 대한 문제가 생길 수 있다. 공유자원에 대한 안전성을 제공하기 위해 임계영역에 대한 처리를 하다보면 비효율적인 처리가 생길 수 있다. 예를 들어, 임계 영역에 오랜 시간이 걸리는 작업이 있고, 다른 스..