예외 처리어떤 프로그램을 만들더라도 예외는 발생하기 마련이다.예전부터 이러한 예외처리를 위해 다양한 방법이 생겨났다. 기본적인 if문부터 시작해서 try-catch, throws 등등 예외 처리를 위한 많은 방법이 존재한다. 그러나 수많은 예외를 if문, try-catch 문으로 모두 처리하기에는 코드가 너무 복잡하고 어려워진다. 스프링은 @ExceptionHandler라는 어노테이션으로 매우 편리한 예외 처리 기능을 제공한다. @ExceptionHandler@ExceptionHanlder 어노테이션을 사용하면 컨트롤러(Controller) 계층에서 발생하는 예외를 처리할 수 있다. @RestController@Slf4jpublic class BoardController { @ExceptionHa..
에러 상황 Spring에서 Apache POI를 통해 엑셀 파일을 읽으려고 했다. 그런데 연도(year) 셀을 읽을 때 cannot get a STRING value from a numeric cell 라는 에러가 발생했다. 해당 에러는 숫자가 입력된 셀에서 String을 추출하려고 할 때 발생한다. 그런데 엑셀 파일에서 해당 셀을 확인해보니 셀 서식이 텍스트로 되어있었다. 아파치 POI 라이브러리가 좀 멍청한건지, 숫자로 써져있어도 셀 서식이 텍스트면 String으로 읽어야 하는데 숫자로 읽는것 같다. 해결법 해결법 1 row.getCell(1).setCellType(CellType.String); year = row.getCell(1).getStringCellValue(); 첫번째 방법은 셀타입을 강..
@RequestParam 어노테이션 @RequestParam 어노테이션은 주로 HTTP 요청의 파라미터를 읽어 메서드의 매개변수에 바인딩할 때 사용한다. 예를 들어 https://www.code-lab1/v1/board?page=1&pageSize=10 위와 같이 API 호출을 한다고 하자. @GetMapping("/v1/board") public ResponseDto getBoardList( @RequestParam(value="page") Integer page, @RequestParam(value="pageSize") Integer pageSize){ System.out.println(page + ", " + pageSize);// 1, 10 } @RequestParam 어노테이션은 value 속성..
@RequestMapping 실무에서 사용되는 대부분의 컨트롤러는 @RequestMapping을 사용한다. 컨트롤러의 메서드에 @RequestMapping 어노테이션을 붙이면 해당 URL이 호출될 때 이 메서드가 호출된다. 어노테이션을 기반으로 동작하므로 메서드의 이름을 임의로 지을 수 있다. 예를 들어 @Controller public class BoardController{ @RequestMapping("/board/article") public ModelAndView getArticle(HttpServletRequest request, HttpServletResponse response){ ... } } .../board/article URL이 호출되면 getArticle 메서드가 호출된다. 또한 ..
Spring MVC Framework란? MVC는 Model-View-Controller의 약자로 하나의 디자인 패턴을 뜻한다. Spring MVC에 대해 이해하려면 Model, View, Controller에 대한 이해가 필수이니 해당 내용에 대해 잘 모른다면 다음을 참고하자. [Web] MVC 패턴이란? MVC 패턴의 등장 배경 MVC 패턴의 등장 배경 하나의 서블릿 혹은 JSP만으로 비즈니스 로직과 뷰 렌더링까지 모두 처리한다면, 너무 많은 역할을 하게 되어 유지보수가 어렵다. 또한, UI를 일부 수정하는 일과 비즈니스 code-lab1.tistory.com Spring MVC Framework는 웹 애플리케이션을 빌드하기 위한 프레임워크이다. 다른 MVC Framework 들도 웹 어플리케이션을 ..
AOP (Aspect Oriented Programming)란? AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 모듈화 하겠다는 것이다. *모듈화 : 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것 예를 들어 핵심적인 관점은 비즈니스 로직이 될 수 있고, 부가적인 관점은 핵심 로직을 실행하기 위해 행해지는 데이터베이스 연결, 로깅, 파일 입출력 등이 될 수 있다. AOP는 흩어진 관심사(Crosscutting Concerns)를 모듈화 할 수 있는 프로그래밍 기법이다 [그림 1]과 같이 클래스 A, B, C에서 공통적으로 나타나는 색깔 블록은 중..
데이터베이스 Connection Pool이나 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다. 스프링을 통해 이러한 초기화 작업과 종료 작업을 어떻게 진행할 수 있을까? 스프링 빈 생명 주기 콜백 스프링 빈은 객체를 생성하고, 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료된다. 따라서 초기화 작업은 의존관계 주입이 모두 완료되고 난 다음에 호출해야 한다. 개발자가 의존 관계 주입이 모두 완료된 시점을 어떻게 알 수 있을까? 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려주는 다양한 기능을 제공한다. 또한 스프..
다양한 의존관계 주입 방법 의존관계 주입은 크게 4가지 방법이 있다. 1. 생정자 주입 2. 수정자 주입(setter 주입) 3. 필드 주입 4. 일반 메서드 주입 생성자 주입 생성자 주입은 이름 그대로 생성자를 통해 의존관계를 주입받는 방법 생성자 호출 시점에 딱 한 번만 호출되는 것이 보장된다 주로 불변, 필수 의존 관계에 사용한다 불변 처음에 세팅한 값을 변경하는 것을 허용하지 않는 것을 불변이라고 한다. 필수 변수에 final 키워드를 적용하면 무조건 값이 초기화되어야 한다. 따라서 해당 필드가 초기화되어있지 않으면 컴파일 오류를 발생시킨다. 생성자로 해당 필드를 필수로 초기화해야 한다. @Component public class PizzaService { private final PizzaRep..
컴포넌트 스캔(Component Scan) 컴포넌트 스캔이란 스프링이 스프링 빈(Bean)으로 등록될 준비가 된 클래스들을 스캔하여 빈(Bean)으로 등록해주는 과정을 말한다. @Component 어노테이션이 붙어있는 클래스들은 전부 컴포넌트 스캔의 대상이 된다. @Configuration, @Service, @Repository, @Controller, 등의 어노테이션에도 전부 @Component이 포함되어 있어 자동으로 컴포넌트 스캔의 대상이 된다. @ComponentScan과 컴포넌트 스캔 범위 컴포넌트 스캔을 사용하기 위해서는 설정 정보 클래스에 @ComponentScan 어노테이션을 붙여줘야 한다. 이때 컴포넌트 스캔의 범위는 설정 정보 클래스의 패키지를 포함한 모든 하위 패키지가 된다. 이때 ..