PRG Post/Redirect/Get
·
Study/Spring
Post Mapping 시 발생할 수 있는 문제로 등록폼에서 데이터를 가져와 디비나 로컬상에 저장하는 로직에서 쉽게 발견할 수 있다. @PostMapping("/add") public String addItemV3(@ModelAttribute Item item) { itemRepository.save(item); return "basic/item"; } 해당 메소드를 통해 데이터를 저장하는 데에 성공했다. 하지만 새로고침을 하면 어떻게 될까? 마지막 요청 리퀘스트를 다시 요청하기 때문에 기존 post 메소드로 이전에 작성했던 데이터를 그대로 다시 담아 request를 보낸다. 따라서 같은 데이터가 여러 개 생성됨을 확인할 수 있다. 즉 문제의 원인은 마지막 리퀘스트가 post이기 때문이다. 이를 Get으..
HTTP 헤더, 파라미터, 바디 조회하는 방법
·
Study/Spring
먼저 헤더 조회 방법부터 소개하겠습니다 헤더 조회 @RequestHeader, @CookieValue 스프링에서는 해당 어노테이션을 통해 헤더 정보를 가져올 수 있다, @RequestMapping("/headers") public String headers(HttpServletRequest request, HttpServletRequest response, HttpMethod httpMethod, Locale locale, @RequestHeader MultiValueMap headerMap, @RequestHeader("host") String host, @CookieValue(value = "myCookie", required = false) String cookie ) { log.info("requ..
slf4j 로깅 알아보기
·
Study/Spring
평소 개발에는 콘솔에 출력으로 사용했지만 실무에서는 대부분 로그로 찍는다길래 왜 로그를 사용하는지 한번 배워봤다. 스프링에서 탑재하고 있는 로깅 인터페이스 slf4j를 사용해볼 것이다. 따로 의존성 추가 없이 바로 import 해주면 된다. 로깅 메소드 먼저 slf4j에서 로그 출력할 때 사용하는 기본적인 메소드들을 알아보자 trace, debug, info, warn, error로 로그를 출력할 수 있고 따로 가능이 있는 것이 아니라 로그를 출력해줄 때 레벨을 구분하여 출력 여부를 결정하는데 사용한다. package hello.springmvc.basic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframewor..
[Spring] MVC 패턴
·
Study/Spring
Model View Controller Controller HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다. Model 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다. View 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중한다. 여기서는 HTML을 생성하는 부분을 말한다. 참고 컨트롤러에 비즈니스 로직을 둘 수도 있지만, 이렇게 되면 컨트롤러가 너무 많은 역할을 담당한다. 그래서 일반적으로 비즈니스 로직은 서비스(Service)라는 계층을 별도로 만들어서 처리한다. 그리고 컨트..
[Spring] 웹 스코프 - Request
·
Study/Spring
웹 스코프 웹 환경에서만 동작한다 프로토타입과 다르게 스프링이 해당 스코프의 종료 시점을 관리한다. 웹 스코프의 종류 request session application websocket 제가 사용해본 스코프는 request로 각각의 request마다 별도의 빈 인스턴스가 생성되고, 관리된다. 클라이언트 A -> A전용 request bean 클라이언트 B -> B전용 request bean 각각의 request bean을 확인하기 위해 Logger를 생성하여 해당 객체에 유효한 uuid생성하여 출력하도록 구현 코드 MyLogger @Component @Scope(value = "request") public class MyLogger { private String uuid; private String r..
[Spring] 싱글톤 스코프에서 프로토타입 스코프 사용 시 문제점과 해결 방법
·
Study/Spring
먼저 싱글톤과 프로토타입의 차이점에 대해 알아보자 싱글톤 VS 프로토 타입 싱글톤 스프링 컨테이너 생성 시 빈 객체가 같이 생성되며 컨테이너 종료 시 같이 소멸한다. 객체 인스턴스가 한 번만 생성되고 각 클라이언트에서 같은 객체를 공유하여 사용한다 프로토타입 스프링 컨테이너가 종료되고 같이 소멸하지 않고, 클라이언트에서 더 이상 사용되지 않으면 가비지 컬렉터에 의해 수거된다. 클라이언트에서 호출 될 때마다 새로운 객체를 반환한다. 프로토 타입 설정과 테스트 package hello.core.scope; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContex..
[Spring] 빈 등록 초기화(@PostContruct), 소멸 메소드(@PreDestroy)
·
Study/Spring
객체를 사용할 때 초기화가 이루어지고 사용해야 한다. 빈 객체도 마찬가지다. 초기화가 이루어진 상태로 사용해야 한다. 다음 코드를 살펴보자 코드 및 설명 public class BeanLifeCycleTest { @Test public void lifeCycleTest() { ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class); NetworkClient client = ac.getBean(NetworkClient.class); ac.close(); //스프링 컨테이너를 종료, ConfigurableApplicationContext 필요 } @Configuration static cl..
스프링 자동 의존관계 주입
·
Study/Spring
의존간계 주입 방법 의존관계를 주입해줄 때는 @Autowired 어노테이션을 사용한다 1. 생성자 주입 생성자 호출 시점에 딱 1번만 호출되는 것이 보장 불변, 필수 의존관계에 사용 생성자가 하나만 존재하면 @Autowired 생략 가능 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { t..
스프링 컨테이너의 싱글톤 패턴
·
Study/Spring
스프링 컨테이너 따로 싱글톤 패턴을 적용하지 않아도 객체 인스턴스를 싱글톤으로 관리한다. 싱글톤 레지스트리 라고도 한다. 싱글톤 테스트 다음과 같은 생성자 주입 configuration이 있을 때 스프링 컨테이너를 활용하여 싱글톤이 정상적으로 작동하는지 확인해보자. 테스트1 package hello.core; import hello.core.discount.DiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.MemberRepository; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import ..
IoC, DI, 그리고 컨테이너
·
Study/OOP
IoC (Inversion of Control) - 제어의 역전 개발자가 직접 객체를 생성, 설정, 초기화, 소멸 등의 객체의 생명 주기를 제어하는 것은 자연스러운 일이다. 하지만 위 역할을 개발자가 직접 하는것이 아니라 개발자가 구현한 코드 및 프레임워크에게 위임하는 것을 IoC, 제어의 역전이라고 한다. 저번 게시글에서 AppConfig 클래스를 생성하여 생성자 주입을 통해 객체의 생성과 연결을 위임했었다. 이처럼 프로그램의 제어 흐름을 직접 제어 하지 않고 외부에서 제어하는 것을 제어의 역전이라고 부른다. 프레임워크 VS 라이브러리 프레임워크 - 내가 작성한 코드를 대신 제어하고, 대신 실행 ( ex) JUnit ) 라이브러리 - 내가 작성한 코드가 직접 제어의 흐름을 담당 DI (Dependenc..