Controller 사용해서 에러 페이지 반환 - 정적 페이지CustomErrorController: Spring이 기본 제공하는 ErrorController 인터페이스 자체 구현-> 에러 시 statusCode에 따라 표기 페이지 분기 @Controllerpublic class CustomErrorController implements ErrorController { @RequestMapping(value = "/error", method = RequestMethod.GET) public String handleError(HttpServletRequest request) { Object status = request.getAttribute(RequestDispatcher.ERRO..
ASAC 웹 풀스택
스프링부트 어플리케이션 실행 시 뜨는 로그 분석추가한 의존성Spring Web: 가장 기본적으로 Spring MVC 기반의 REST API 혹은 웹 페이지 반환을 위한 Tomcat서버Lombok: 불 필요한 Java 코드 작성을 최소화하기 위한 어노테이션 기반 코드 자동 생성기Thymeleaf: Spring 에서 웹 페이지를 만들어 클라이언트에게 서빙하려 사용하는 서버사이드 템플릿 엔진 Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext (2가지 존재)Servlet (Web) Applicationcontext: 서블릿에서만 이용되는 Bean 에 대한 ContextDispatcherServlet이 직접 사용하는 컨트롤러..
객체지향 설계원칙 SOLID객체지향 패러다임에서 더 좋은 코드란 무엇인가에 대한 고민의 결과 High Cohesion, Loose Coupling 목표 1. Single Responsibility (단일 책임)하나의 모듈은 한가지 책임만 가진다.그래야지만 모듈이 변경되는 이유가 단 한가지일 수 있다.해당 모듈이 여러 대상 또는 액터들에 대해 책임을 가져서는 안되고, 오직 하나의 액터에 대해서만 책임을 져야한다는 것을 의미 패스워드 암호화 로직이 유저 정보를 추가하하는 로직에 위치한다면addUser는 물론 암호화한 뒤에 데이터베이스에 저장되어야겠지만 암호화 로직이 Raw한 상태로 addUser에 그대로 노출되어 있음암호화 로직이 변경되는 것이 addUser전체 로직에 변경을 발생시킨다.@Service@Re..
Enumenum은 여러 상수를 선언해야할 때, 편리하게 선언할 수 있는 방법파라미터나 메서드 수행에 있어 너무 많은 경우의 수가 발생하는 것이 싫은 경우 케이스를 한정적으로 정의시 사용메서드 수행에 필요한 Integer, String과 같은 경우의 수가 많은 파라미터에 대해public static String createMessage(String message) { return "당신에게 메세지를 보냅니다. : " + message;}위 코드에서 파라미터에 `String` 타입이면 모든지 다 들어갈 수 있다.sendMessage(MessageType.LOVE);sendMessage(MessageType.THANKS);Enum을 활용해서 상황에 맞춰 파라미터들을 제약할 수 있다. Enum을 사용한다면, ..
다형성(Polymorphism)여러가지 형태를 가질 수 있는 능력을 의미, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록함으로써 다형성을 프로그램적으로 구현하였다.하나의 동일 클래스의 메서드가 다양한 구현체로 호출된다. 다형성: 추상 클래스 상속을 통한`aobj.print()`로 호출가능하고, `bobj.print()`형태로도 호출 가능오버라이드: 부모 메서드를 덮어쓰기오버로드: 동일한 클래스에서 동일한 이름의 메서드로 파라미터만 다른 메서드class B extends A { private int tax = 100; // 오버라이드 Override, Over-write public void print() { System.out.println(super.price + tax); }..
Interface 추상화가장 필요한 요소를 제회하고 모두 다 감춰버리는 것자바에서는 "인터페이스" 혹은 "추상 클래스" 를 통해 이뤄낼 수 있다.인터페이스: 구현체는 감추고, 필요한 메서드만 노출 -> 메서드 가져다 호출만 하면 된다.추상 클래스: 구현체는 감추고, 필요한 필드와 메서드만 노출 -> 메서드, 필드 가져다 호출만 하면 된다.Generic제네릭스는 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크(compile-time type check)를 해주는 기능이다.객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안전성을 높이고 형변환의 번거로움이 줄어든다.💡타입의 안전성?타입의 안전성을 높인가는 것은 의도하지 않은 타입의 객체를 저장하는 것을 막고, 저장된 객..
Final: 고정 - 수정 불가능 1. final 필드: 값이 변하지 않는다.필드(클래스 내 변수)에 final예약어가 사용되면, 값이 변하지 않는다는 의미언제 사용? 단위나 고정값을 사용할 때 2. final메서드: 상속(Override)되지 않는다.메서드(클래스 내 함수)에 final 예약어가 사용된다면, Override(상속)가 되지 않는다는 의미언제 사용? 해당 메서드가 꼭 한가지의 구현만으로만 다양한 곳에서 사용되는 경우상속 받았다고, 상속받은 메서드를 너무 쉽게 Override하면, 해당 사용처서 side effect발생 가능아래 코드는 `Member` 클래스에 정의된 final 메소드이다. add() 메서드에서는 나이에 10만 더하는 기능만 사용하고 싶다면 아래와 같이 final로 메소드 ..
객체 종류: DTO와 VO - 객체 목적에 따른 명칭DTO(Data Transfer Object)가변 객체 = 객체 내 데이터를 Getter로 조회 가능, 객체 내 데이터를 Setter로 쓰기 가능순수하게 데이터를 담아 계층간 전달하는 객체로직을 갖고 있지 않은 순수한 데이터 객체이며 메서드로는 getter / setter만 갖는다.Setter의 경우 변조 가능성 有 -> 생성자로 값을 넣어주도록 하면 전달하는 과정에서 변조가 불가능package com.example.spring_practice.dto;import lombok.Getter;import lombok.Setter;@Getter//@Setterpublic class MemberDto { private String name; priv..
정적 팩토리 메서드객체를 생성할 수 있는 방법이 오직 단, 하나의 정적 메소드 방식으로 만 가능하도록 설정팩토리 메서드 = 객체를 생성 및 반환하는 정적 메서드정적 메소드의 의의는 기존 객체에서 새로운 객체로의 변환이다.한가지 예를 들어보자면 Enum의 요소를 조회할 때 사용하는 `valueOf`도 정적 팩토리 메서드의 일종이라고 할 수 있다.미리 생성된 객체를 "조회"를 하는 메서드이기 대문에 팩토리 역할을 한다고 볼 수는 없지만, 외부에서 원하는 객체를 반환해주고 있으므로 결과적으로는 정적 팩토리메서드라고 간주해도 좋다.public enum Color { RED, BLUE;}...Color redColor = Color.valueOf("RED");Color blueColor = Color.val..