목록프로그래밍 (408)
쌓고 쌓다
현재 게시글 등록과 수정시 전달하는 폼 데이터가 동일하다. 하지만. 폼에서 전달하는 데이터가 실무에서는 차이가 있다. 등록시에는 약관과 같은 추가적인 정보를 받을 수 있으며, 등록시와 다르게 수정시 다른 BeanValidation을 적용할 수도 있다. (EX. 게시글 수정시 내용은 없어도 괜찮음) 그래서 폼 데이터와 동일한 데이터를 전달 받을 별도의 객체를 만들어서 받는것이 좋다. 전달 받은 별도의 객체의 데이터를 통해 컨트롤러에서 게시글 객체를 생성하자. 원래의 폼 데이터 처리 방식과 비교해서 생각해보면 게시글 객체를 또 다시 만드는 이유를 알 수 있다. 기존 방식 - 도메인 객체 그대로 사용 HTML Form -> Poster -> Controller -> Poster -> Repository Pos..
먼저 Bean Validation 사용을 위해 클래스에 어노테이션을 사용했다. @Data public class Item { private Long id; @NotBlank(message = "공백X") private String itemName; @NotNull @Range(min=1000, max=100000) private Integer price; @NotNull @Max(99) private Integer quantity; } 오류 코드는 붙은 어노테이션의 이름을 그대로 따라간다. 예를들어 @NotBlank에서 오류가 발생했다면 NotBlank라는 오류 코드로 다양한 메시지를 생성해낸다. 이때 메시지 생성은 MessageCodesResolver를 통해 생성해낸다. NotBlank로 생성된 메시지..
SessionConst package com.example.demo.session; public class SessionConst { public static final String LOGIN_MEMBER = "loginMember"; } HttpSession에 데이터를 보관하고 조회할 때, 자주 사용되므로 상수를 정의하여 사용할 수 있다. 신규 세션 등록 @GetMapping("kakao/test") public String kakaoOauth(HttpServletRequest request) { //로그인 후. Member 반환 Member member = kaKaoUser.login(token.get("access_token")); HttpSession session = request.getSess..
application.properties - jpa가 날리는 sql 보기 spring.jpa.show-sql=true 코드를 작성했는데 이상하게 SELECT 문이 나가는것이다... memberRepository.save(member); save시 INSERT 쿼리가 날라가고 SELECT 쿼리가 날라가는 것이다. 왜일까? save 메서드는 이미 존재하는 식별자 값이라면 이미 있는 엔티티로 판단해 merge를 한다. 만약 없는 식별자 값이라면 새로운 엔티티로 persist를 한다. 즉, 이미 존재하는 식별자 값이면. 변경 사항이 있다면 UPDATE하고 존재하지 않는 식별자 값이라면 INSERT한다. 한번 진짜 존재하는 엔티티 식별자가 있으면 UPDATE를 날리는지 보자. 현재 DB에 값이 존재한다. 이때 똑..
문제의 코드를 보자. Member findMember = memberRepository.findById(member.getId()).get(); if(findMember==null) { ... } Repository에서 ID를 통해 회원을 찾아 get으로 객체를 꺼내 없으면 if문을 통해 로직을 수행하게하려 했으나... 위의 에러가 발생했다. Optional에서 get으로 꺼낼때 안에 객체가 존재하지 않으면 Exception을 터트린다. 해결 방법 Member findMember = memberRepository.findById(member.getId()).orElse(null); orElse를 통해 값이 있다면 그 값을 반환하고 없다면 null을 반환하도록 했다.
BeanValidation으로 검증 코드를 작성하지 않고 어노테이션 하나로 검증 로직을 편리하게 적용할 수 있다. 의존 관계 추가 implementation 'org.springframework.boot:spring-boot-starter-validation' Poster 클래스 @Entity @Getter @Setter @ToString public class Poster { @NotBlank private String title; @NotBlank private String writer; @NotBlank private String content; private LocalDateTime regdate; @NotNull @Range(min = 100, max = 250) private Long heig..
서블릿 필터로 모든 요청 로그를 남겨보자. 서블릿 필터에 대한 포스팅은 작성한 적 있다. https://non-stop.tistory.com/587 LogFilter - 로그 필터 package com.example.board.filter; import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import java.io.IOException; import java.util.UUID; @Slf4j public class LogFilter implements Filter { @Override public void init(FilterConfig filterConfig) ..
서블릿 필터의 필요성 상품 관리 페이지가 있다고 하자. 이 페이지는 로그인 회원만 이용이 가능하다. 상품 관리와 관련된 컨트롤러의 모든 로직에 로그인 여부를 체크할 수 있지만 모든 등록, 수정, 삭제, 조회 등등 공통으로 로그인 여부를 확인하는 로직이 필요하며, 추후에 로그인 로직과 관련된 수정 사항이 있을때 작성한 코드를 또 모두 수정해야한다. 위의 예처럼 애플리케이션 여러 로직에서 공통으로 필요한 부분을 "공통 관심사"라고 한다. 공통 관심사 문제는 서블릿 필터나 스프링 인터셉터를 사용하여 해결할 수 있다. 서블릿 필터 흐름 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 WAS(Web Application Server)로 tomcat이 있다. 필터의 흐름에 있는 서블릿은 Dispat..