Time Complexity (시간 복잡도) 알고리즘의 핵심은 얼마나 효율적으로 코드를 작성하는가에 있다. 이 효율성을 검증하는데에 시간 복잡도를 들 수 있다. 시간 복잡도는 알고리즘이 입력 크기에 따라 소요되는 시간의 증가율을 말한다. 즉, 알고리즘을 설계할 때, 시간 복잡도를 고려한다는 것은 알고리즘이 처리하는 데이터의 크기에 따라 실행 시간이 어떻게 증가하는지를 고려하는 것을 의미한다. 시간 복잡도를 고려하여 알고리즘을 설계하면 다음과 같은 장점이 있다. 입력의 크기에 따라 실행 시간이 어떻게 증가하는지 사전 파악 가능 실행시간 최소화 및 효율적인 문제 해결 그로 인해 최적의 알고리즘 발견 Big - O 표기법 시간 복잡도를 표기하는 방법은 크게 3가지가 있다. Big-O(빅-오) ⇒ 상한 점근 (..
스프링 부트는 앞서 서블릿 오류페이지 처리의 과정들을 기본으로 제공한다. 그로 인해 스프링 부트에서 복잡한 처리를 진행해주어서 개발자는 오류페이지만 등록해주면 된다. 스프링 부트 예외 페이지 처리 ErrorPage를 자동으로 등록한다. => ' /error ' 경로로 기본 오류페이지를 설정한다. new ErrorPage("/error") 서블릿 밖으로 예외가 발생하거나, response.sendError(...) 가 호출되면 모든 오류는 /error 를 호출하게 된다. BasicErrorController를 자동으로 등록 : ErrorPage에서 등록한 /error 를 매핑해서 처리하는 컨트롤러 이러한 처리로 개발자는 오류 페이지 화면만 규칙에 맞게 작성하여 등록하면 된다. BasicErrorContro..
서블릿은 다음 2가지 방식으로 예외를 처리한다. Exception response.sendError Exception (예외) 자바 직접 실행의 경우 자바의 메인 메서드를 직접 실행하는 경우 main이라는 이름의 쓰레드가 실행된다. 실행 도중에 예외를 잡지 못하고 main()을 넘어서 예외가 던져지면 예외 정보를 출력하고 해당 쓰레드는 강제 종료된다. 웹 애플리케이션 웹 애플리케이션은 사용자 요청별로 별도의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 실행된다. 애플리케이션에서 예외가 발생했는데, try-catch문으로 잡지 못하고 서블릿 밖으로까지 예외가 전달되면 WAS까지 이동된다. 이동되는 단계는 다음과 같다. WAS(여기까지 전달된다) 서블릿 -> 필터 -> WAS(sendError 호출 기록 확인..
만약, 웹 브라우저 페이지 중 로그인한 회원만 이용할 수 있는 기능들이 있을때, 어떻게 개발을 해야할까? 아마, 로그인한 회원 정보가 필요한 로직들에 공통적으로 로그인 여부를 확인하는 코드(공통관심사)를 다 작성을 해야할 것이다. 하지만 이는 중복되는 코드도 많고 유지보수적으로 애로사항이 매우 크다. 이렇게 애플리케이션 여러 로직에서 공통으로 관심이 있는 있는 것을 공통 관심사(cross-cutting concern)라고 한다. 이러한 공통 관심사를 해결하는 방법은 다음과 같다. 스프링 AOP 필터, 인터셉터 웹과 관련된 공통 관심사를 처리할 때는 HTTP의 헤더나 URL의 정보들이 필요하기 때문에 필터, 인터셉터를 활용하여 해결하는 것이 좋다. 서블릿 필터나 스프링 인터셉터는 HttpServletReq..
쿠키와 세션은 보통 로그인, 로그아웃을 구현할 때 주로 사용된다. 예를 들어, 사용자가 웹사이트에서 로그인을 할 때 그 로그인한 상태를 유지할 수 있어야 하는데 이를 쿠키와 세션이 그 역할을 한다. 쿠키(Cookie) 클라이언트에 저장되는 키(key)와 값(value)이 들어있는 작은 데이터 파일 브라우저에서 로그인한 사용자 정보를 기억하게 하려면 쿠키에 그 사용자 정보를 저장하면 된다. 사용자가 로그인을 하면, 서버에서 id, password로 사용자를 식별한다. 그 다음, 쿠키를 생성하여 쿠키에 사용자 정보를 담아 클라이언트에 전달한다. (쿠키 저장소에 저장) 이후 브라우저(클라이언트)는 쿠키 저장소에서 해당 사용자 정보를 읽어 사용자 상태를 유지할 수 있다. 영속 쿠키, 세션 쿠키 영속 쿠키 : 쿠..
Bean Validation이란? http://hibernate.org/validator/ The Bean Validation reference implementation. - Hibernate Validator Express validation rules in a standardized way using annotation-based constraints and benefit from transparent integration with a wide variety of frameworks. hibernate.org Bean Validation은 특정한 구현체가 아니라 Bean Validation 2.0(JSR-380)이라는 자바에서 지원하는 기술 표준이다. 쉽게 이야기해서 검증 애노테이션과 여러 인터페이..
오류코드 작성법 errors.properties 파일로 오류코드를 한 곳에 모아 관리하도록 할 때 메시지를 단계별로 나누어 필요에 따라 적절히 활용할 수 있도록 할 수 있다. 메시지를 세분하는 이유? 메시지를 작성할 때 여러 곳에서 사용할 수 있도록 일반적으로 작성하면, 범용성은 좋지만, 자세한 상황을 설명해야 되는 부분에서는 전달이 어려울 수 있다. 또한 자세한 설명을 위해 메시지 자체를 세밀히 작성하면, 여러 곳에서 사용하기에는 적합하지 않다. 따라서, 메시지를 단계별로 나누어 보다 범용성으로 사용하다가, 세밀하게 작성해야 하는 경우 세밀한 내용이 적용되도록 하는 것이다. 메시지를 단계별로 사용할 때, 보다 구체적일수록 우선순위가 높다. ex) required FieldError 메시지 생성 방식 참..
컨트롤러의 중요한 역할 중 하나는 HTTP 요청이 정상인지 검증하는 것이다. 클라이언트 검증 & 서버 검증 클라이언트 검증 : 자바스크립트를 활용한 검증 서버 검증 : 요청이 넘어와 컨트롤러나 서버의 다른 부분에서 검증 클라이언트 검증은 조작이 가능하여 보안에 취약하다. 서버만으로 검증하면, 즉각적인 고객 사용성이 부족해진다. 따라서, 이 둘을 적절히 사용하되, 서버 검증은 필수이다. API 방식을 사용하면 API 스펙을 잘 정의해서 검증 오류를 API 응답 결과에 잘 남겨주어야 한다. BindingResult 스프링이 제공하는 검증 오류를 보관하는 객체 검증 오류가 발생하면 BindingResult 객체에 보관하면 된다. *주의!! - BindingResult 는 검증할 대상 바로 다음에 와야한다. =..
메시지 만약, 프로젝트를 진행하던 중 기획자가 화면에 보이는 문구를 바꿔달라는 요청이 들어왔는데 이를 고치려면 어떻게 해야할까? 개발자 입장에서는 하드코딩으로 되어있는 문구를 일일히 바꾸려면 매우 번거로운 일이 아닐 수 없다. 여러 화면에 보이는 문구를 다 찾아가면서 변경해야 하기 때문이다. 스프링은 이러한 다양한 메시지를 관리하도록 하는 기능을 제공하는 데 이를 '메시지 기능'이라 한다. 예를 들어서 messages.properties라는 메시지 관리용 파일을 만들고 ==messages.properties== sports=스포츠 sportsId=스포츠 ID sports.sportName=스포츠명 sports.type=스포츠 유형 {0} 각 HTML들은 다음과 같이 해당 데이터를 key값으로 불러서 사용..
폼 데이터 처리 - th : object , th : field th : object , th : field 는 폼 데이터 바인딩에 주로 사용되는 속성이다. th : object 컨트롤러에서 전달받은 모델 객체를 현재 폼에 바인딩하는 속성 즉, 컨트롤러에서 전달 받은 모델 객체를 HTML의 데이터로 사용할 수 있게끔 도와주는 속성이다. th : field th : object로 받은 객체의 필드와 폼의 입력 필드를 연결 시키는 속성 주로 ' *{...} ' 형태의 선택 변수 식을 활용하여 th : object에서 선택한 객체의 필드에 접근한다. HTML태그의 id, name, value 속성을 자동으로 처리해준다. 예제) 상품명 th:object="${item}" : 에서 사용할 모델 객체(item)를 ..