Study/Java

    Custom Exception: 검사 예외, 런타임 예외 무엇을 써야할까

    포인트 사용 시 포인트가 부족하면 IllegalArgumentException(extends RuntimeException) 예외 발생 @Entity public class Point { private Integer amount; ... public Integer usePoint(Integer amount) { checkEnoughPoint(amount); this.amount -= amount; return this.amount; } private void checkEnoughPoint(Integer amount) { if(this.amount - amount < 0) throw new IllegalArgumentException("사용할 포인트가 부족합니다."); } } 표준 예외로 간단하게 쓰기 위..

    @ExceptionHandler는 어떻게 예외를 처리할 수 있을까?

    결론부터 말하자면 DispatcherServlet 덕분에 가능하다. DispatcherServlet의 동작 방식을 확장하여 만들어진 여러 가지 전략 중 예외 처리 전략도 있다. HandlerMapping(URL과 요청정보를 기준으로 어떤 컨트롤러를 사용할 건지 결정) HandlerAdapter(HandlerMapping 전략에 따라 선택한 컨트롤러가 어떤 타입이든 DispatcherServlet가 사용할 수 있게 함) ViewResolver(컨트롤러가 리턴한 뷰 이름을 참고해서 적절한 뷰 오브젝트를 찾아줌) ... HandlerExceptionResolver(예외 처리) 예외가 발생했을 때 종류에 따라 클라이언트에게 알려주는 작업은 DispatcherServlet을 통해 처리되어야 하기 때문이다. @Co..

    자바의 함수형 프로그래밍 전략, 메서드 참조

    자바 8의 주요 컨셉은 함수형 프로그래밍 지향이다. 여기서 함수형 프로그래밍이란 함수를 일급 값으로 넘겨주도록 구현하는 것이다. 객체를 여기저기로 넘겨주며 활용하는 것처럼 메서드도 그렇게 하면 프로그램을 더 효율적으로 구현할 수 있다. 자바의 함수형 프로그래밍의 전략 중 하나로 메서드 참조가 있다. 메서드 참조는 말 그대로 객체를 참조하듯, 메서드를 참조하는 것이다. 메서드 참조의 문법은 " :: " 다. 이 메서드를 값으로 사용하라는 의미다. File[] hiddenFiles = new File(".").listFiles(File::isHidden); "그래서 메서드 호출이랑 참조가 뭐가 다른 건데?"라는 질문이 생길 수 있다. 아래의 간단한 코드 예제를 보면 두 개념의 차이 그리고 자바의 지향점을 알..

    [Java] 제네릭

    들어가기 전 에러가 발생하는 시간을 기준으로 컴파일 에러와 런타임 에러로 나눌 수 있다. 둘 중에 어떤 게 더 치명적일까? 컴파일 에러는 IDE가 바로 알려주기 때문에 고치기 쉽다. 반면 런타임 에러는 그 코드가 실제 사용되기 전까지는 발견하기가 어렵다. 게다가 그 에러로 인해 실제 데이터에 영향을 준다면 더 치명적일 것이다. 런타임 에러가 발생할 여지가 있는 코드를 컴파일 단계에서 검사를 한다면 치명적인 에러를 줄일 수 있다. 제네릭이란 클래스, 인터페이스, 메서드를 정의할 때 타입(클래스 및 인터페이스)을 매개변수로 사용하는 기능 사용하는 이유? 1. 컴파일 시 타입 검사를 해 코드의 안정성을 높임 2. 형변환 번거로움이 줄어듦 여기까지만 보면 설명이 추상적이라 명확하게 이해가 되지 않을 수 있다. ..

    JVM 명세 - Run-Time Data Areas

    공식 JVM 명세 The Java Virtual Machine Specification, Java SE 11 Edition 문서이고 번역은 파파고로 했다. -> 표시 뒤 문장은 내가 단 주석이다. 명세 중 JVM에서 다루는 데이터 유형과 Run-time Data Areas에 대한 내용이다. JVM이란? JVM은 추상적인 컴퓨팅 머신이다. 실제 컴퓨팅 머신처럼, 그것은 명령어 세트를 가지고 있고 실행 시 다양한 메모리 영역을 조작한다. JVM은 자바 프로그래밍 언어에 대해 전혀 알지 못하며, 특정 바이너리 형식, 클래스 파일 형식만 알고 있다. 클래스 파일에는 Java Virtual Machine 명령(또는 바이트 코드)과 기호 테이블 및 기타 보조 정보가 포함되어 있습니다. 형식 및 데이터 유형 1. c..

    자바로 간단한 http 웹 서버 구현

    자바지기님의 유튜브 영상과 자료를 참고하여 실습을 진행한다. 기본으로 제공되는 프로젝트가 있으며 요구사항에 맞춰 코드를 발전시킨다. 요구사항마다 힌트가 있으나 우선 스스로 구현 방법을 생각해본다. https://www.youtube.com/watch?v=qgFVj916nX8&list=PLqaSEyuwXkSqV88SwDxuY56xmj6KsmzRN&index=1 https://www.slideshare.net/javajigi/http-web-server HTTP web server 구현 자바 기반으로 web server를 직접 구현하면서 HTTP 동작 원리에 대해 이해한다. www.slideshare.net 개발 환경 설정 지난 번의 간단한 자바 통신 구현에서 봤던 내용들이다. 프로젝트(위 슬라이드에 깃허브..

    간단한 자바 TCP 통신 구현

    TCP 연결 지향적 프로토콜 (1) 클라이언트가 연결 요청, 서버가 연결 수락하면 통신 선로 고정 (2) 통신 선로를 통해 데이터가 순차적으로 전달 ServerSocket과 Socket 자바는 java.net.ServerSocket과 java.net.Socket을 제공한다. ServerSocket은 클라이언트의 연결 요청 대기, 연결 수락 역할을 한다. Socket은 두 서버 간의 통신에서 데이터를 주고 받는 엔드포인트 역할을 한다. I/O Stream 통신이 연결되었다면 엔드포인트에서 데이터가 왔다갔다 한다. 자바에서 데이터는 Stream을 통해 이동한다. Stream은 단방향이므로 데이터 발신, 수신을 위한 Stream이 각각 필요하다. OutputStream 발신을 위한 스트림이며 바이트 기반 출력..

    자바 빌더 패턴 Java Builder Pattern

    무한 생성자 오버로드(overload) 이미 생성자 오버로드가 너무 많았고 나도 거기에 하나를 더 추가해야 하는 상황이 있었다. 생성자를 호출할 때 매개변수에 대한 정보를 알 수 없는 점이 너무 불편했고 코드도 쓸데없이 너무 길어졌다. // 예시 public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; public NutritionFacts() { this(0) } public NutritionFacts(int servingSize) { this(servingSize, 0) } public NutritionFact..