Spring 23

스프링 메세지 소스 및 국제화(MessageSource, Locale)

Message 기획자가 화면에 보이는 문구를 변경해달라는 상황이다, 상품명이라는 단어를 모두 상품이름으로 고쳐달라고 하면 어떻게 해야할까? 그러면 많은 화면에 해당하는 수십개의 파일을 수정해야 한다... 이를 유연하게 대처할 수 있는 방법은 뭐가 있을까? messages.properties 메세지 관리용 파일을 만드는 것이다! item=상품 item.id=상품 ID item.itemName=상품명 item.price=가격 item.quantity=수량 이런식으로 한 곳에 작성해두고, 필요시에 각 HTML 태그에서 해당 데이터를 Key 값으로 불러 사용하는 것이다. 그럼 해당 데이터를 어떻게 불러 사용할까? 위의 예시와 같이 th:text = "#{...}" 형식을 맞춰 사용해줘야 한다. 위와 같이 작성하..

Spring 2023.12.14

Spring - ArgumentResolver 활용

우리가 파라미터로 넘기거나 받는 Argument들을 스프링이 어떻게 알아채고 처리하지? 라는 고민을 한 사람들이 있을 수 있다. 이를 해결해주는 해결사가 바로 스프링의 "ArgumentResolver"이다. 이 argumentResolver는 스프링의 뒤편에서 많은 일들을 해준다. 이의 기능을 활용해서 기존에 작성했던 HomeController를 수정해보도록 하자. 기존 HomeController @GetMapping("/") public String homeLoginV3Spring( @SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) { //세션에 회원 데이터가 없으면 h..

Spring 2023.09.26

Spring- 필터, 인터셉터(Filter, Interceptor)

공통 관심 사항 현재 우리의 상황은 아이템을 등록하고, 판매하는 웹 사이트를 만들고 있는 상황이다. 해당 사이트는 로그인을 한 사용자만 물건을 등록하거나 판매할 수 있다. 그러면, 비로그인 사용자는 물건을 등록하는 페이지에 들어갈 수 없도록 막아야 한다. 또한, 로그인한 사용자만 상품 관리 페이지에 들어갈 수 있도록 해야 한다. 문제는, 비로그인 사용자도 해당 페이지의 URL을 직접 호출하면 들어갈 수 있다는 것이다. 해당 컨트롤러에서 로그인 여부를 체크하는 로직을 하나하나 작성해도 되지만, 로그인의 여부는 여러 컨트롤러에 공통되게 적용되는 사항이다. 때문에, 이렇게 여러 로직에서 공통으로 관심이 있는 것을 공통 관심사(cross-cutting-concern)이라고 한다. 이 문제를 Filter와 Int..

Spring 2023.09.18

Spring- 쿠키, 세션(Cookie, Session)[로그인]

2023.07.28 - [Http] - HTTP Header(헤더)의 구조, 쿠키 HTTP Header(헤더)의 구조, 쿠키 HTTP Header는 왜 쓰일까? → HTTP 헤더는 인터넷 상에서 HTTP 프로토콜을 이용해 데이터를 전송하는 HTTP 전송에 필요한 모든 부가 정보를 전달하기 위해 존재한다. ( 메시지 바디의 내용, 메시지 바디 junhyuk-develop.tistory.com 우선, 쿠키가 어떻게 동작하는지 알아야 하기 때문에, 위의 글을 읽어보고 해당 글을 읽는 것을 추천한다. 현 상황은 웹 사이트를 만드는 중인데, 로그인을 하는 로직 등과 검증 로직 등을 작성한 상태이다. 쿠키, 세션을 사용해서 로그인, 로그아웃 기능을 구현해보는 것을 목표로 한다. 로그인 상태 유지 로그인의 상태를 어..

Spring 2023.09.18

컴포넌트 스캔 (@ComponentScan)

컴포넌트 스캔, 의존 관계 자동 주입 지금까지는 스프링 빈을 등록할 때는 설정 정보(Config)에 직접 등록할 스프링 빈을 나열했다. 스프링 빈을 @Bean을 통해서 일일이 등록을 할 수 있지만, 이렇게 되면 굉장히 귀찮게 된다. 이를 해결하기 위해, 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공한다. 또한, 의존 관계를 자동으로 주입하는 @Autowired 기능도 제공한다. @ComponentScan 지금까지 사용한 AppConfig를 유지하며, 새로운 AutoAppConfig를 만들어보자. @Configuration @ComponentScan(excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = C..

Spring 2023.08.02

싱글톤 패턴, 싱글톤 컨테이너 (Singleton)

웹 애플리케이션과 싱글톤 스프링은 기업에서 많이 사용된다. 대부분의 스프링 애플리케이션은 웹 애플리케이션이다. 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 여러 고객이 위와 같이 동시에 요청을 하게 되는데, 스프링 없는 순수한 DI 컨테이너인 AppConfig은 요청을 할 때마다 객체를 새로 생성한다. 이렇게 되면 그만큼 많은 객체가 생성되고 소멸되므로 메모리 낭비가 심하다! 이를 해결하기 위해 싱글톤 패턴을 사용해서 해당 객체가 1개만 생성되고 이를 공유하도록 설계하면 된다! 싱글톤 패턴 → 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴 그래서, 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 한다. ( private 생성자를 이용해 new 를 못하도록 함 ) 코드를..

Spring 2023.08.02

스프링 컨테이너, 스프링 빈(Spring Container, Spring Bean)

스프링 컨테이너 ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); 위의 코드가 스프링 컨테이너를 생성하는 코드이다. 여기서, ApplicationContext를 스프링 컨테이너라고 한다. ( 이는 인터페이스로 구성됨 ) 스프링 컨테이너는 XML이나 애노테이션 기반 자바 설정 클래스로 만들 수 있다. (여기서는 자바 설정 클래스를 기반으로 스프링 컨테이너를 만들 것이다.) 즉, 위의 코드를 통해 ac는 ApplicationContext 인터페이스의 구현체가 된다. [ 엄밀히 말하자면, 스프링 컨테이너를 부를 때는 BeanFactoy, ApplicationContext를 구분해서 이야기한다. 그러나, BeanFac..

Spring 2023.08.02

Spring Basic- Bean Scope(웹 스코프)

2023.06.09 - [SpringBoot] - Spring Basic- Bean Scope(프로토타입 스코프) Spring Basic- Bean Scope(프로토타입 스코프) 빈 스코프가 무엇일까? 우리는 스프링 빈이 스프링 컨테이너의 시작과 함께 생성되며, 종료와 동시에 같이 사라지는 것을 알고 있다. 이는 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때 junhyuk-develop.tistory.com 앞서 말한 프로토타입 스코프에 이어서 이번에는 web scope 에 대해서 알아보자. 웹 스코프가 뭘까? 웹 스코프는 웹 환경에서만 동작하는 스코프이다. 웹 스코프는 스프링 컨테이너가 해당 스코프의 종료 시점까지 관리한다. → 종료 메서드 호출된다. 웹 스코프의 종류에는 request, sess..

Spring 2023.06.10

Spring Basic- Bean Scope(프로토타입 스코프)

빈 스코프가 무엇일까? 우리는 스프링 빈이 스프링 컨테이너의 시작과 함께 생성되며, 종료와 동시에 같이 사라지는 것을 알고 있다. 이는 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프는 말 그대로 존재할 수 있는 범위 이다. 스프링이 제공하는 스코프에는 대표적으로 뭐가 있을까? 싱글톤 프로토타입 웹 관련 스코프 request session application 자세한 내용은 위의 순서대로 설명하겠다. 스코프를 설정(지정)하는 방식은 예상하는 바와 같이 컴포넌트 스캔 자동 등록으로 가능하다. @Scope("prototype") @Component public class HelloBean {} 또한, 수동 등록도 가능하다. @Scope("prototype") @Bean PrototypeBe..

Spring 2023.06.09

Spring Basic- Bean LifeCycle CallBack

DB Connection pool, Network Socket처럼 Application 시작 지점에 필요한 connection을 미리 해두고, Application 종료 시점에 connection을 모두 종료하는 작업을 하려면, 객체 초기화와 종료 작업이 필요하다. 이 작업들이 어떻게 진행되는지 예제를 통해 알아보자. 간단하게 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정해보자. 실제로 네트워크에 연결하는 것은 아니고, 단순히 문자만 출력하도록 했다. 이 NetworkClient 는 애플리케이션 시작 시점에 connect() 를 호출해서 연결을 맺어두어야 하고, 애플리케이션이 종료되면 disConnect() 를 호출해서 연결을 끊어야 한다. public class NetworkClient {..

Spring 2023.05.24
1 2 3