본문 바로가기

전체 글

(197)
[Java] Optional로 null 데이터를 다룰 때 안티 패턴을 주의해야 한다. 사용자의 입력은 믿을 수 없는 정보이다.사용자 입력에서 발생할 수 있는 예외 케이스를 고민해야 한다. 그리고 예외 케이스에 대한 검증이 필요하다.ex) 이메일 입력창에 특수 문자를 입력할 수 있다. null을 대하는 자세→ 항상 NPE를 방지하는 방향으로 경각심을 가지고 코드를 작성한다.→ return null을 자제한다. NPE 발생 여지를 만든다.→ 대안책으로 Optional이 있다. Optional에 대하여→ Optional은 비싼 객체다. 꼭 필요한 상황에서만 반환 타입으로만 사용한다. 반환 타입이 아닌 파라미터로 받지 말자.→ Optional은 분기 케이스가 존재한다.Optional 자체가 null인지Optional에 담긴 데이터가 null인지따라서 파라미터로 Optional을 받아서는 안 된다..
[Spring] Lombok에서 @Data와 @AllArgsConstructor는 지양하자. @Data 애너테이션포함하는 애너테이션 : @Getter, @Setter, @RequireArgsConstructor, @ToString, @EqualsAndHashCode/** * @see Getter * @see Setter * @see RequiredArgsConstructor * @see ToString * @see EqualsAndHashCode*/@Target({ElementType.TYPE})@Retention(RetentionPolicy.SOURCE)public @interface Data { String staticConstructor() default "";} @Data 애너테이션이 포함하는 애너테이션들에 대해서 알아보자. @Setter는 수정하면 안 되는 값을 수정하게 만든다.E..
테스트가 어려운 영역을 분리하기 테스트가 어려운 코드 영역 구분주문 메서드 작성키오스크 주문은 10시 ~ 22시 사이로 가능하다. 그 시간 외에는 IllegalArgumentException 예외가 발생한다.@Getterpublic class CafeKiosk { public static final LocalTime SHOP_OPEN_TIME = LocalTime.of(10, 0); public static final LocalTime SHOP_CLOSE_TIME = LocalTime.of(22, 0); private final List beverages = new ArrayList(); public Order createOrder() { LocalDateTime currentDateTime = Loc..
[HTTP] Short Polling과 Long Polling HTTP 프로토콜HTTP 프로토콜은 클라이언트-서버 모델로써, 클라이언트가 요청을 보내면 서버가 응답을 내리는 구조이다. HTTP의 특징으로는 stateless(무상태)와 connectionless(비연결성)이다.  Stateless(무상태)서버는 클라이언트의 이전 요청에 대해서 기억하지 않는다. 즉, 서버는 응답을 내려준 클라이언트의 요청에 대해서 기억하지 않는다는 것이다.ex) 사용자가 로그인 페이지에서 로그인을 했더라도 다른 페이지로 이동하면 로그인이 유지되지 않는다.상태를 유지하기 위해서는 쿠키(Cookie), 세션(Session), 토큰(Token) 등을 사용하여 클라이언트와 서버 간의 상태를 기억할 수 있다.Connectionless(비연결성)HTTP는 TCP(Transmission Contr..
[Spring] @Value는 static 변수에 사용할 수 없다. 문제 시나리오CorsConfig 클래스에 작성된 domain 필드가 존재한다.@Value 애너테이션을 사용하여 application.yml에 작성한 값을 domain 필드에 주입한다.application.yml... 생략server: domain: ${SERVER_DOMAIN}CorsConfig@Configurationpublic class CorsConfig { @Value("${server.domain}") static String domain; public static CorsConfigurationSource corsConfiguration() { CorsConfiguration configuration = new CorsConfiguration(); ..
[Spring] Redis를 사용하여 조회 성능 개선하기 1. 회고 카드(Section)와 회고 보드(Retrospective)우리 프로젝트는 1개의 회고 보드에 여러 개의 회고 카드를 작성할 수 있다. 즉, 회고 보드와 회고 카드는 1:N 관계이다. 따라서 회고 보드를 조회하면 작성된 모든 회고 카드를 조회할 수 있다. 2. 새로운 회고 카드(Section) 생성하기우리 프로젝트는 회고 보드(retrospective)에 작성된 모든 회고 카드(section)를 DB에서 조회한다. GET /sections를 호출하여 모든 회고 카드를 조회하는 것을 확인할 수 있다. 새로운 회고 카드를 등록하면 POST /sections 요청을 통해 DB에 새로운 회고 카드를 등록한다. 생성된 회고 카드를 포함하는 모든 회고 카드를 가져오기 위해서 다시 GET /section..
[운영체제] 임계 구역과 동기화 기법(뮤텍스 락, 세마포) 이전에 뮤텍스 락과 세마포에 대해서 다룬 적이 있습니다. 현재 글은 이전 글을 다듬어서 새로 작성된 게시물입니다.https://server-technology.tistory.com/338  동기화가 필요한 이유여러 스레드가 동시에 임계 구역(Critical Section)에 접근하면 데이터 일관성 문제가 발생할 수 있다. 임계 구역이란 공유 자원에 여러 스레드가 동시에 접근하였을 때 문제가 발생할 수 있는 코드 영역이다. 여러 스레드가 동시에 임계 구역에 접근하여 문제가 발생하는 것을 레이스 컨디션(Race Condition)이라고 한다.레이스 컨디션 문제를 해결하기 위해서는 동기화 처리가 필요하다. 동기화란 실행 순서를 제어하고 상호 배제를 준수하는 것이다.실행 순서 제어 : 여러 스레드가 존재할 때 ..
[운영체제] 해시 테이블(Hash Table)과 해시 충돌(Hash Collision) 1. 해시 테이블(Hash Table)이란?해시 테이블이란 키와 값의 대응으로 이루어진 데이터 구조이다. 예를 들어, ISBN 번호가 키라면 그에 대응하는 책 제목이 값이 된다. 만약 ISBN 번호 9791162245651을 키로 입력하면 대응하는 값으로 혼자 공부하는 파이썬이 반환된다. 해시 테이블에서는 해시 함수를 사용하여 키를 특정 버킷에 매핑한다. 버킷은 배열처럼 여러 개로 이루어진 저장 공간이다. 해시 함수는 입력된 키에 대해 인덱스를 계산해 해당 버킷에 데이터를 저장하거나 찾을 수 있도록 한다. 예를 들어, Hanbit이라는 키를 해시 함수에 입력하면 해시 함수가 계산한 인덱스 2에 데이터를 저장하게 된다. 다른 키들도 마찬가지로 해시 함수를 통해 계산된 인덱스를 기반으로 버킷에 저장된다. 2..