1. 홈 화면 추가 @Controller public class HomeController { @GetMapping("/") public String home() { return "home"; } } Hello Spring 회원 기능 회원 가입 회원 목록 스프링 컨테이너에서 관련 컨트롤러를 먼저 찾고 없으면 static contents로 넘어가게 된다. Controller가 우선순위이기 때문에 정적 컨텐츠가 아닌 localhost:8080/ url에 매치되는 컨트롤러를 탄다. 2. 회원 등록 화면 @Controller public class MemberController { private final MemberService service; @Autowired public MemberController(M..
분류 전체보기
스프링이 실행될 때 스프링 컨테이너라는 통이 생성된다. @Controller 어노테이션이 있으면 MemberController 객체를 생성해서 컨테이너에 넣어두고 스프링이 빈으로 관리한다. 스프링 빈 등록하는 2가지 방법 Component Scan @Component: 컨테이너에 스프링 빈으로 등록하는 어노테이션 @Service, @Controller, @Repository에 @Component가 포함되어 있다. @Autowired: 객체를 연결시키는 어노테이션 (연관관계 설정) 컴포넌트 스캔은 실행되는 Application과 같은 패키지 하위 내에서만 작동한다. 스프링은 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다 -> 유일하게 하나만 만들어서 공유 자바 코드로 직접 스프링 빈 등록..
1. 비즈니스 요구사항 정리 2. 회원 도메인과 리파지토리 만들기 1. MemberRepository 인터페이스 생성 public interface MemberRepository { Member save(Member member); Optional findById(Long id); Optional findByName(String name); List findAll(); } 2. 인터페이스를 구현하는 MemoryMemberRepository 생성 public class MemoryMemberRepository implements MemberRepository { // key=id, value=Member 형식으로 저장 private static Map store = new HashMap(); private..
스프링의 기본기를 탄탄히 하기 위해 김영한의 Spring 강의를 듣기 시작했다. 원래 알던 내용이 많지만 동작 원리에 대해 더 심층적으로 이해하기 위해 공부하려고 한다. 정적 컨텐츠 (static) static 폴더에 hello-static.html 파일을 생성한다. static content http://localhost:8080/hello-static.html 경로를 치고 들어가면 해당 뷰로 연결된다. hello-static이라는 컨트롤러가 없기 때문에 static에 있는 hello-static이라는 이름의 html 파일을 찾음 템플릿 엔진 MVC: Model, View, Controller 템플릿 엔진: 동적으로 생성되는 웹 페이지나 문서의 구조와 내용을 분리하여 관리하는 도구 템플릿 파일과 데이터..
JWT는 JSON Web Token의 약자로, 웹에서 정보를 안전하게 전송하기 위한 인증 방식 중 하나이다. 이 방식은 두 개체 사이에서 JSON 객체를 사용하여 정보를 안전하게 전송하도록 설계되어 있다. 이 정보는 디지털 서명이 되어 있어서 보증할 수 있다. JWT는 클라이언트와 서버 간에 토큰 기반 인증을 할 때 주로 사용된다. Cookie, Session, Token Cookie 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일 사용자가 웹 사이트에 방문할 때 생성되며, 사용자의 PC에 저장된다. 쿠키의 주요 목적은 사용자의 이전 활동을 기억하고, 그 정보를 활용해서 사용자에게 맞춤화된 서비스를 제공하는 것이다. 1. 클라이언트가 서버에 요청을 보낸다. 2. 서버가 응답할 때, 클라이언트 측에 ..
원래 JPA를 이용하여 개발할 때, Entity를 DTO 타입으로 변환하는 과정에서 ModelMapper나 생성자 방식을 사용했다. 새롭게 알게 된 MapStruct라는 것이 ModelMapper보다 간편하고 실행 시간에서 이점이 있다고 하여 공부하게 됐다. 또한, 다른 Mapping Library들 중 속도가 가장 빠르고, compile 중 에러를 확인할 수 있다고 한다. // 쪽지 읽기 @Override public GetMessages readMessage(Long id){ Optional result = repository.findById(id); Message message = result.orElseThrow(() -> new HttpClientErrorException(HttpStatus.N..
원래 예외 처리를 할 때 가장 기본적인 방식인 if, else 또는 try, catch를 이용하여 서비스단에서 아래와 같이 처리했다. 하지만 이런 경우 서비스의 규모가 커지면 코드가 길어져서 가독성이 떨어지게 된다. 이런 문제점을 해결하기 위하여 @RestControllerAdvice를 이용하는 방법을 찾아 공부하게 됐다. 더보기 @RestControllerAdvice과 @ControllerAdvice의 차이점 두 어노테이션의 주요 차이점은 @ResponseBody의 적용 여부이다. @ControllerAdvice는 이 어노테이션을 직접 적용해야 하지만, @RestControllerAdvice는 기본적으로 @ResponseBody가 적용되어 있다. @ResponseBody는 메소드가 반환하는 값을 HTT..
Projections.bean()과 Projections.fields()는 QueryDSL에서 제공하는 메소드로, 쿼리 결과를 특정 클래스의 인스턴스로 맵핑하는 역할을 한다. -> 특정 필드만 선택적으로 조회하고 싶을 때 사용 둘 다 동일한 목적을 가지고 있지만, 내부적으로 사용하는 방식에 차이가 있다. Projections.bean() 이 메소드는 JavaBean 스펙을 따르는 객체에 대한 프로젝션을 생성한다. JavaBean 스펙이란, 기본 생성자를 가지고 있고, getter와 setter 메소드를 통해 필드에 접근하는 클래스를 의미한다. Projections.bean() 메소드는 클래스의 기본 생성자를 이용해 인스턴스를 생성하고, 각 필드의 setter 메소드를 이용해 값을 설정한다. 따라서 이 메..