본문 바로가기
728x90

백엔드/Spring(Boot)87

스프링 서블릿 오류 페이지 설정 스프링 빈 등록 package hello.exception; import org.springframework.boot.web.server.ConfigurableWebServerFactory; import org.springframework.boot.web.server.ErrorPage; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; @Component public class WebServerCustomizer implements WebServerFactoryCu.. 2021. 10. 2.
스프링 ArgumentResolver 컨트롤러 @Login 어노테이션 등록(사용자가 만들어줘야함) @GetMapping("/") public String homeLoginV3ArgumentResolver(@Login Member loginMember, Model model){ // 세션에 회원 데이터가 없으면 home if (loginMember == null) { return "home"; } // 세션이 유지되면 로그인으로 이동동 model.addAttribute("member", loginMember); return "loginHome"; } @Login package hello.login.web.argumentresolver; import java.lang.annotation.ElementType; import java.lang.an.. 2021. 10. 1.
스프링 인터셉터 - 인증 체크 인터셉터 package hello.login.web.interceptor; import hello.login.web.SessionConst; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @Slf4j public class LoginCheckInterceptor implements HandlerInterceptor { @Override public boo.. 2021. 10. 1.
스프링 인터셉터 - 요청로그 인터셉터 package hello.login.web.interceptor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.UUID; @Slf4j public class LogInterceptor implem.. 2021. 10. 1.
스프링 서블릿 필터 - 로그인 인증 체크 필터 package hello.login; import hello.login.web.filter.LogFilter; import hello.login.web.filter.LoginCheckFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.servlet.Filter; @Configuration public class WebConfig { @Bean public FilterRegistrationBean.. 2021. 9. 30.
스프링 서블릿 필터 - 요청 로그 필터 chain.doFilter 무조건 해줘야한다. 안해주면 웹 동작 안함 package hello.login.web.filter; import lombok.extern.slf4j.Slf4j; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.UUID; @Slf4j public class LogFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("log filter init"); } @Overrid.. 2021. 9. 30.
스프링 로그인(쿠키, 세션) 로그인 컨트롤러 import hello.login.domain.login.LoginService; import hello.login.domain.member.Member; import hello.login.web.SessionConst; import hello.login.web.session.SessionManager; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.validation.anno.. 2021. 9. 30.
스프링 Bean Validation 컨트롤러 팁! 수정 form 이랑 생성 form이랑 다르게 Validation 체크를 해야한다! @ModelAttribute에 값 지정하지 않으면 스프링에서 자동으로 이름변경한다음 model에 넣어주므로 체크! package hello.itemservice.web.validation; import hello.itemservice.domain.item.Item; import hello.itemservice.domain.item.ItemRepository; import hello.itemservice.domain.item.SaveCheck; import hello.itemservice.domain.item.UpdateCheck; import hello.itemservice.web.validation.form.. 2021. 9. 29.
스프링 API JSON 검증 컨트롤러 import hello.itemservice.web.validation.form.ItemSaveForm; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; impo.. 2021. 9. 29.
스프링 검증 Validation 검증 V1 Controller @PostMapping("/add") public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes, Model model) { //검증 오류 결과를 보관 Map errors = new HashMap(); //검증 로직 if (!StringUtils.hasText(item.getItemName())) { errors.put("itemName", "상품 이름은 필수입니다."); } if (item.getPrice() == null || item.getPrice() 1000000) { errors.put("price", "가격은 1,00.. 2021. 9. 24.
스프링 메시지, 국제화 메시지 하드코딩된 HTML 문자열들을 별도의 파일("messages.properties")에서 변수로 관리하는 방법 국제화 메시지에서 설정한 파일("messages.properties")을 각 나라별로 별도로 관리하면 서비스를 국제화 할 수 있다. "messages_en.properties" 설정 파일 item=Item item_id = Item Name "messages_ko.properties" 설정 파일 item=상품 item_id = 상품 ID 접근 인식 방법은 HTTP "accept-language" 헤더 값을 사용하거나 사용자가 직접 언어를 선택하도록 하고, 쿠키 등을 사용해서 처리하면 된다. 스프링부트인 경우 application.properties에서 설정해 주면된다. message 테스트.. 2021. 9. 23.
스프링 리다이렉트 컨트롤러에서 리다이렉트 사용시 참고 // @PostMapping("/add") public String addItemV5(Item item){ itemRepository.save(item); // 이렇게 사용하면 한글같은 경우 인코딩이 되지 않음 return "redirect:/basic/items/"+item.getId(); } @PostMapping("/add") public String addItemV6(Item item , RedirectAttributes redirectAttributes){ Item savedItem = itemRepository.save(item); redirectAttributes.addAttribute("itemId", savedItem.getId()); redirectA.. 2021. 9. 11.
스프링 HTTP 응답 (HTTP API, 메시지 바디에 직접 입력) import hello.springmvc.basic.HelloData; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus;.. 2021. 9. 10.
스프링 정적 리소스, 뷰 템플릿 정적 리소스 스프링 부트는 클래스패스의 다음 디렉토리에 있는 정적 리소스를 제공한다. /static , /public , /resources , /META-INF/resources src/main/resources 는 리소스를 보관하는 곳이고, 또 클래스패스의 시작 경로이다. 따라서 다음 디렉토리에 리소스를 넣어두면 스프링 부트가 정적 리소스로 서비스를 제공한다. 뷰 템플릿 스프링 부트는 기본 뷰 템플릿 경로를 제공한다. src/main/resources/templates import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotati.. 2021. 9. 10.
HTTP 요청 메시지 (JSON) import com.fasterxml.jackson.databind.ObjectMapper; import hello.springmvc.basic.HelloData; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpEntity; import org.springframework.stereotype.Controller; import org.springframework.util.StreamUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.sp.. 2021. 9. 10.
HTTP 요청 메시지 (단순 텍스트) import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpEntity; import org.springframework.stereotype.Controller; import org.springframework.util.StreamUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.ServletInputStream; imp.. 2021. 9. 9.
스프링 HTTP 요청 파라미터 - @ModelAttribute import hello.springmvc.basic.HelloData; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http... 2021. 9. 9.
스프링 HTTP 요청 파라미터 - @RequestParam import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import j.. 2021. 9. 9.
스프링 HTTP 헤더 조회 import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpMethod; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.. 2021. 9. 9.
스프링 API 개발 기초 @RestController @RequestMapping("/mapping/users") public class MappingClassController { @GetMapping public String user(){ return "get users"; } @PostMapping public String addUser(){ return "post user"; } @GetMapping("/{userId}") public String findUser(@PathVariable String userId) { return "get userId = " + userId; } @PatchMapping("/{userId}") public String updateUser(@PathVariable String userId).. 2021. 9. 9.
스프링 요청 매핑 @RestController public class MappingController { private Logger log = LoggerFactory.getLogger(getClass()); @RequestMapping(value = "/hello-basic",method = RequestMethod.GET) public String helloBasic(){ log.info("helloBasic"); return "ok"; } @GetMapping(value = "/mapping-get-v2") public String mappingGetV2(){ log.info("mapping-get-v2"); return "ok"; } @GetMapping("/mapping/{userId}") public Strin.. 2021. 9. 9.
로깅 로그 라이브러리는 Logback, Log4J, Log4J2 등등 수 많은 라이브러리가 있는데, 그것을 통합해서 인터페이스로 제공하는 것이 바로 SLF4J 라이브러리다 SLF4J는 인터페이스이고, 그 구현체로 Logback 같은 로그 라이브러리를 선택하면 된다. 로그 선언 private Logger log = LoggerFactory.getLogger(getClass()); private static final Logger log = LoggerFactory.getLogger(Xxx.class) @Slf4j : 롬복 사용 가능 로그 호출 log.info("hello") 실무에서는 항상 로그를 사용해야 한다. package hello.springmvc.basic; import lombok.extern.slf.. 2021. 9. 8.
JPA 페이징 * JPA는 페이징을 2가지로 추상화 setFirstResult(int startPosition) : 조회 시작 위치 (0부터 시작) setMaxResults(int maxResult) : 조회할 데이터 수 2021. 9. 3.
프로젝션 - 여러 값 조회 SELECT m.username, m.age FROM Member m • 1. Query 타입으로 조회 • 2. Object[] 타입으로 조회 • 3. new 명령어로 조회 단순 값을 DTO로 바로 조회 SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m 패키지 명을 포함한 전체 클래스 명 입력 순서와 타입이 일치하는 생성자 필요 출처 인프런 김영한 강사님 JPA 강의 2021. 9. 3.
JPQL 문법 * select m from Member as m where m.age > 18 * 엔티티와 속성은 대소문자 구분 O (Member, age) * JPQL 키워드는 대소문자 구분 X (SELECT, FROM, where) * 엔티티 이름 사용, 테이블 이름 아님(Member) * 별칭은 필수(m) (as는 생략가능) 2021. 9. 3.
JPA 영속성 전이(cascade) 특정 엔티니를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 떄 예) 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장 2021. 9. 3.
JPA 영속성 전이(cascade) 특정 엔티니를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 떄 예) 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장 2021. 9. 1.
상속 관계 매핑 슈퍼타입 서브 타입 놀리 모델을 실제 물리 모델로 구현하는 방법 1.조인 전략 장점 테이블 정규화 외래키 참조 무결성 제약조건 활용가능 단점 조회시 조인을 많이 사용, 성능 저하 조회 쿼리가 복잡함 데이터 저장시 insert sql 2번 호출 2.단일 테이블 전략 장점 조인이 필요 없으므로 일반적으로 조회 성능이 빠름 조회 쿼리가 단순함 단점 자식 엔티티가 매핑한 컬럼은 모드 null 허용 단일테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. # JPA 기본정책은 단일 테이블 전략이다 3.구현 클래스마다 테이블 전략 장점 서브 타입을 명확하게 구분해서 처리할 때 효과적 Not null 제약조건 사용 가능 단점 여러 자식 테이블을 함께 조회할 때 성능이 느림 자식 테이블을 통합해서 쿼리하기 어려움 슈.. 2021. 8. 31.
JPA 엔티티에서 엔티티를 속성으로 가지는 경우 Member 와 Team이 1:N 연관간계고 단방향인 경우 Member -> Team @Entity public class Member { public Member() { } @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; 2021. 8. 27.
JPA 필드와 컬럼 매핑 출처 인프런 김영한 강사님 ORM 표준 JPA 프로그래밍 기본편 https://www.inflearn.com/course/ORM-JPA-Basic/dashboard 2021. 8. 26.
728x90