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. 형변환 번거로움이 줄어듦 여기까지만 보면 설명이 추상적이라 명확하게 이해가 되지 않을 수 있다. ..

    3. JAVA로 아주 간단한 WAS와 Spring MVC Framework 만들기

    WAS란 Socket과 HTTP 구현 Servlet Container & Spring Container 구현 Servlet 구현 MVC 구현 Servlet Container 구현 Servlet Container란 서블릿 컨테이너는 브라우저와 같은 클라이언트로부터 들어오는 요청을 받아서 서블릿을 동작시켜 주는 일을 맡는다. 서블릿은 웹 애플리케이션이 시작될 때 미리 만들어둔 웹 애플리케이션 컨텍스트에게 빈 오브젝트로 구성된 애플리케이션의 기동 역할을 해줄 빈을 요청해서 받아둔다. 그리고 미리 지정된 메소드를 호출함으로써 스프링 컨테이너가 DI 방식으로 구성해 둔 애플리케이션의 기능이 시작되는 것이다. RequestHandler 앞서 구현한 WebServer에서 RequestHandler 인스턴스를 생성하여..

    2. JAVA로 아주 간단한 WAS와 Spring MVC Framework 만들기

    WAS란 네트워크 연결 (with Socket) 구현 Servlet Container & Spring Container 구현 Servlet 구현 MVC 구현 구현 코드 GitHub - leelee31/was: WAS 구조와 Spring MVC 동작 학습용 프로젝트 WAS 구조와 Spring MVC 동작 학습용 프로젝트. Contribute to leelee31/was development by creating an account on GitHub. github.com 네트워크 연결 (with Socket) 구현 Web Application Server, 서버를 구현한다는 것은 무엇일까? '클라이언트/서버'는 컴퓨터 간의 관계를 역할로 구분하는 개념이다. 서버는 서비스를 제공하는 컴퓨터이고, 클라이언트는 ..

    1. JAVA로 아주 간단한 WAS와 Spring MVC Framework 만들기

    WAS란 네트워크 연결 (with Socket) 구현 Servlet Container & Spring Container 구현 Servlet 구현 MVC 구현 프로젝트 목적 WAS와 Spring MVC Framework는 자바를 배우고 나서부터 사용해 왔지만 대략적인 구조만 알고 있었다. 구조로 인한 에러를 여러 번 겪다 보니 언젠간 직접 구조를 만들면서 학습해 봐야겠다고 생각했다. 하지만 뭐부터 해야 할지 막막함이 커 시작하기까지 오랜 시간이 걸렸다. 이 학습 프로젝트가 누군가의 막막함을 해소하는 데 작게나마 도움이 되었으면 좋겠다. 구현 코드 GitHub - leelee31/was: WAS 구조와 Spring MVC 동작 학습용 프로젝트 WAS 구조와 Spring MVC 동작 학습용 프로젝트. Cont..

    커피 주문 서비스를 객체 지향으로 설계해보기 with Java

    프로젝트의 목적 지난 3년간 업무에서 접했던 코드들은 객체 지향과는 거리가 멀었다. Service단이나 DAO는 추상화가 되어있었지만 대부분의 데이터는 Map으로 관리해야 했다. 자바라는 언어에 관심을 갖게 된 계기가 '객체 지향'이었기 때문에 마음속엔 항상 아쉬움이 있었다. Map으로 데이터를 관리하는 건 어떨까? 예를 들어 customer에 name, address, phone number라는 속성이 있다고 하자. 컨트롤러는 화면으로부터 customer 정보가 담긴 Map 타입 파라미터를 받는다. 컨트롤러에서 customer가 가진 속성을 확인하려면 디버깅을 하거나 for문으로 Map 내부를 모두 print 해봐야 한다. 그뿐만이 아니다. 실수로 map.get("nmae")으로 오타를 내서 에러가 날..