김영한님 강의와 다른 여러 스프링 강의에서 DB와 매핑하기 위한 객체를 생성하는 경우 숫자 타입에 Long을 사용하는 것을 볼 수 있었다. 더 자세하게는 “회원” 엔티티의 AUTO_INCREMENT 인 PK 값을 Long 타입으로 선언했다. 회원 도메인의 레코드 수가 21억개 이상이 될 수 있어서 테이블 컬럼 타입입을 BIGINT로 선언해서 그런것일까? Integer가 아닌 Long 타입을 사용하는 이유가 궁금해서 여러 블로그의 글을 살펴봤는데 내가 확인해 본 블로그 글에서는 모두 같은 내용을 담고 있었다. Wrapper 클래스는 기본 값으로 null을 가진다. Long은 Integer보다 넓은 범위를 표현한다. 뭔가 가려움이 해소되지 않는다.. ☁️ Wrapper 클래스 사용 1번은 나도 겪어본 문제이..
의문과 실험
generic은 wildcard와 달리 Lower Bounded를 지원하지 않는다. public Collection copy(Collection target) { } // 이건 되는데 public Collection copy(Collection target) { } // 이건 안됨 Type Erasure generic은 컴파일타임에 타입 안정성을 보장받는 것이다. Generics were introduced to the Java language to provide tighter type checks at compile time and to support generic programming. To implement generics, the Java compiler applies type erasure - ..
자바를 학습하며 지금까지 1000번은 작성해본 것 같은 메인 메서드에 대해 간단한 고찰을 해보려 한다. 왜 public 이어야 하는가? 메인 메서드의 접근제한자를 private으로 변경하고 컴파일 해보니 컴파일에 성공했다. private static void main(String[] args) { System.out.println("Hello"); } 커맨드에서 실행을 시켜봤더니!! 오류: GodOfJava 클래스에서 기본 메소드를 찾을 수 없습니다. 다음 형식으로 기본 메소드를 정의하십시오. public static void main(String[] args) 또는 JavaFX 애플리케이션 클래스는 javafx.application.Application을(를) 확장해야 합니다. main() must b..
자바의 여러 클래스에서 Synchronized 예약어를 통한 동기화된 블록 혹은 메서드를 심심찮게 볼 수 있다. 당장 생각나는 클래스를 나열하면 StringBuffer, HashTable, Vector, ConcurrentHashMap 등이 있다. 아래 java.util.concurrent 패키지에 많으니 참고하길 바란다. java.util.concurrent (Java Platform SE 8 ) Class Summary Class Description AbstractExecutorService ArrayBlockingQueue CompletableFuture A Future that may be explicitly completed (setting its value and status), and ma..
상속 시, 오버라딩된 메서드는 부모클래스의 메서드보다 같거나 확장된 접근만을 허용한다. public class A { void method() { ... } } // XXX 컴파일 오류 public class B extends A { @Override private void method() { ... } } // OOO public class C extends A { @Override public void method() { ... } } 이는 다형성을 지원하기 위함이라고 생각한다. 만약 오버라이딩된 메서드의 접근 제어 수준을 낮게 설정할 수 있다면 LSP(리스코프 치환 원칙)을 어기게 된다. 리스코프 치환 원칙은 1988년 바바라 리스코프(Barbara Liskov)가 올바른 상속 관계의 특징을 정의하..
https://github.com/livable-final/server/pull/159 목표 달성 포인트 획득 기능 개선 완료 by hyunsb · Pull Request #159 · livable-final/server 목표 달성 포인트 획득 기능을 개선하려 한다. #145 기존의 로직에서 발생하던 4번의 IO를 2번 발생으로 개선했다. DB에서 처리되던 로직을 애플리케이션 코드단에서 처리함으로 인해 성능의 큰 차 github.com 프로젝트를 진행하며 특정 목표를 달성하면 포인트를 지급하는 기능을 구현했다. 해당 기능은 총 4번의 유효성 검사를 필요로 하는데 각 검사는 아래와 같다. 토큰으로 추출된 유저 식별자가 유효한가 금일 이미 목표 달성 포인트를 받았는가 포인트를 받을 수 있는 목표를 달성했는가..
여기 JPA 환경에서의 업데이트 로직이 있습니다. 게시글 아이디로 게시글을 검색하고 파라미터로 넘어온 UserId가 해당 게시글의 작성자인지 확인합니다. 그리고 DTO로 넘어온 데이터를 사용하여 게시글을 업데이트 합니다. @Transactional(isolation = Isolation.READ_COMMITTED) public void updateBy(Long boardId, BoardRequest.updateDTO updateDTO, Long userId) { Board board = getBoardById(boardId); if (!board.isCreatedBy(userId)) throw new BoardUpdateFailureException(ErrorMessage.INVALID_BOARD_CON..
Model과 DTO에 대한 의문점들 DTO와 Model을 왜 분리해야하는가? Model이 DTO의 존재를 모르게 하라? Model→ DTO에 대한 파싱은 어느 레이어에서 수행되어야 하는가? DTO와 Model을 왜 분리해야할까? 가장 중요한 이유는 DB의 민감한 정보를 Response하지 않기 위함일 것이다. 다른 시각으로 협업을 생각해보자 (멘토님은 FE와 BE의 의존성을 분리한다. 라는 말씀을 하셨다) 만약 FE쪽에서 REQUSET를 위한 프로퍼티명을 하나 변경했다고 가정하자. DTO가 없는 환경이라면 BE쪽에서는 Model의 변수명을 변경해야 할 것이고 연쇄적으로 해당 변수와 연관된 비즈니스 로직의 메서드명, 내부 동작에서의 변수명을 변경해야 할 것이다. 당장 생각나는 것만 해도 모델의 변수명, 서..
DAO, DBConntion, Service 기능을 JDBC로 구현하는 작업을 진행하였다. 기존에는 Connection이 싱글톤으로 관리되고 있었다. 또한, DAO가 각자 Connection을 멤버로 가지고 있고, 이를 통해 DB I/O를 실행했다. 하지만 위의 방식은 Connection이 싱글톤으로 관리되기 때문에 멀티스레드 환경에서 동작하지 않는다. 하나의 스레드가 Connection을 가지고 종료될 때까지 반환하지 않기 때문이다. 따라서 멀티스레드 환경을 고려해 DB Connection Pool Manager를 구현하였다. 이는 DB Connection Pool을 관리하며 Connection을 생성하고 반환하는 기능을 가진다. 이제 DAO와 Service는 싱글톤으로 관리되는 것이 더 적절해졌다. ..