프로젝트 생성 개인 프로젝트를 진행하려면, 당연하게도 프로젝트 생성 부터 시작한다. 스프링을 사용하기때문에, 많은 사람이 이용하는 https://start.spring.io/ 사이트에서 원하는 디펜던시를 추가하여 프로젝트 파일을 생성해주자 디펜던시는 추후에도 config에서 추가할 수 있기 때문에 당장 필요한것들만 선택했다. 기본적으로 Spring Web 기본적은 RESTful, MVC, Tomcat을 제공한다고 친절히 설명 돼 있다. 또한 우리 프로젝트의 FE를 책임질 Thymeleaf도 꼭 추가해주자 Lombok은 편리한 기능을 많이 제공해준다. Lombok 어노테이션 기반의 코드 자동생성을 통한 생산성 향상 반복코드 다이어트를 통해 가독성 및 유지보수성 향상 Getter/Setter외 빌더 패턴이나..
실제로 프로젝트를 진행할때에는 커다란 코드만큼 거대한 문서를 먼저 마주한다. 여러가지 명명규칙, 사용 하는 프레임워크의 설명서 등, 환경구성에도 많은 시간을 소비하고 화면정의부터 DB정의, 프로세스의 진행도 등등 많은 정보들을 숙지하고 그에 알맞은 개발을 진행해야한다. 이런 부분들은 대부분 여러명이, 그리고 그 후의 유지보수까지 생각해서 지금까지 발달한 프로젝트 문화이기 때문에, 숨이 막힐거같은 위의 규칙들을 개인 프로젝트에선 조금 널널하게 진행해도 괜찮을 것 같다. 그럼에도, 코드의 일관성을 위한 명명규칙은 헷갈리지 않고 통일시키도록 하고, 프로세스가 어떻게 진행되는지, 일정을 관리하는 부분은 개인 프로젝트에서도 중요시된다. 환경구성 어떠한 프레임워크를 사용하고, 어떤 언어를 이용하고, 어떤 db와 연..
쿠키를 이용한 로그아웃 처리 쿠키를 사용해 유지되는 로그인 상태를 제거하는 방법은 아래와 같다. 기본적으로 HttpServletRespone을 사용하여 CookeName과 비교하여 존재하는 쿠키값을 제거해 주는 것으로 로그아웃을 진행한다. @PostMapping("/logout") public String logout(HttpServletResponse response) { expireCookie(response, "memberId"); return "redirect:/"; } private static void expireCookie(HttpServletResponse response, String cookieName) { Cookie cookie = new Cookie(cookieName, null)..
final 변수, 메서드, 클래스가 변경이 불가능하도록 한다. 변수 : final 로 선언된 변수는 상수로 취급되고, 한 번 초기화 됐을 경우 변경할 수 없다. 메서드 : final로 선언된 메서드는 하위 클래스에서 오버라이드 할 수 없다. 해당 메서드는 상속된 클래스에서 그대로 사용되어야 한다. 클래스 : final로 선언된 클래스는 하위 클래스를 가질 수 없다. 다른 클래스가 해당 클래스를 상속받아 새로운 클래스를 정의하는 것이 불가능하다. 메서드는 오버라이드 할 수 없고, 클래스는 하위 클래스를 정의할 수 없다. finally try/catch 블럭이 종료될 때 항상 실행될 코드 블럭을 정의할 수 있다. 단, finally는 예외가 발생하더라도 항상 실행된다. 주로 리소스 해제, 또는 정리 작업을 ..
로그인 처리 쿠키 로그인 상태 유지하기 로그인 상태를 유지하기 위해서 계속해서 쿼리 파라미터를 보내는 것은 번거로운 작업이기 때문에, HTTP 기본 기능인 쿠키를 사용하는 것이 일반적이다. 웹브라우저에서 POST / GET 요청으로 로그인 처리에 성공했다면, HTTP에 서버에서 쿠키를 저장시키면 클라이언트에서 지속적으로 쿠키값을 자동으로 포함시켜준다. Login controller에서 쿠키를 생성시켜주는 작업을 진행한다. // 로그인 성공 처리 TODO Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId())); response.addCookie(idCookie); // HttpServletResponse response 매..
JAVA Stream java에서 제일 큰 분기점, 큰 변화가 있던 버전이라고 하는 java 8에서 추가된 기능으로, 람다식을 활용할 수 있게 해주는 기술이다. java 8 버전 이전에는 배열을 다루는 방법이 for문, 혹은 foreach문을 통해서 요소의 전부를 탐색하는 방법 밖에 없었다. 이러한 부분은 로직이 복잡해질수록 컨트롤하기 어렵고, 코드의 양이 많아지고, 여러 루프가 반복되며 효율이 떨어지기 마련이었다. 스트림은 배열, 컬렉션 인스턴스에 여러 함수를 조합하여 원하는 결과를 표현할 수 있다. 람다를 이용해 코드의 양을 줄이고, 간결하게 표현할 수 있다. 또한 하나의 작업을 두개 이상 작업으로 잘게 나누어 동시에 처리가 가능한 비동기처리 (병렬처리)가 가능하다. String[] arr = new..
BindingResult 스프링이 제공하는 검증 오류를 담아보관하는 객체로써, BindingResult가 존재하면 @ModelAttribute에 데이터 바인딩 시 오류가 발생하여도 컨트롤러가 호출된다. 해당 클래스가 존재하지 않고, 바인딩시 타입 오류가 발생한다면 400 오류가 발생하면서 컨트롤러가 호출되지 않고 바로 오류페이지로 넘어가게 된다. 오류 정보를 알기 힘들고 컨트롤러가 호출되지 않아 에러 컨트롤이 힘들 수 있다. 해당 클래스에서 제공하는 FieldError, ObjectError 메서드들을 이용하여 오류메시지를 컨트롤할 수 있다. FieldError, ObjectError 사용자 입력 오류 메시지가 화면에 남는 것이 필요하다. 위에서 사용하던 방식대로 진행한다면 입력했던 현재 값이 사라지기 ..
검증 - Validation 지금까지 만든 웹에서는 폼 입력시 숫자를 문자로 작성, 검증 오류가 발생시 화면으로 바로 이동해야 한다. 하지만 이렇게 될 경우 해당 폼으로 다시 이동해서 입력을 해야하기 떄문에 상당히 불편하다. 고객이 입려한 데이터를 유지한채, 어떤 오류가 발생했는지를 알려주려는것이 목적이기 때문이다 컨트롤러의 역할 중 하나는, HTTP 요청이 정상적인지 검증 하는 것에 있는데, 정상 로직보다 이러한 검증 로직을 잘 개발하는 것이 더 어려울 수 있다. 검증 요구사항 클라이언트 검증은 조작이 가능하고, 보안에 취약하다. 그렇지만 서버만으로 검증할 경우는 즉각적인 사용성이 부족해진다. 서로 두가지를 적절히 섞어서 사용하며, 최종적으로 서버검증을 필수적으로 거치는 것이 검증 방법의 최고 효율을 ..