백엔드/Spring 19

jwt refresh token 을 Redis로 리팩토링하기

기존에 db 테이블에 저장하여 조회하던 refresh Token을 Redis 인메모리 데이터 구조 저장소로 리팩토링하는 과정을 기록하는 포스팅입니다. 기존의 코드는 아래와 같습니다. 1. requestBody에 담긴 accessToken을 바탕으로 DB에서 refreshToken을 체크합니다 2. 만약 refreshToken이 valid하다면 accessToken을 발급합니다. DB에서 Redis로 리팩토링 하는 이유 1. refreshToken은 만료기간이 있는 token인데 DB에 저장할 필요가 있는지에 대한 의문이 들었습니다. -> DB는 또한 디스크의 읽기 쓰기와 관련되므로 api 응답속도도 느립니다. -> 인메모리를 사용하는 것으로 리팩토링하기 DB에서 Redis로 리팩토링 하는 과정 1. me..

백엔드/Spring 2024.03.04

Service 계층 단위 테스트를 위한 Mockito 사용하기

기존에 @SpringbootTest 어노테이션를 사용하여 Service 계층을 테스트하였습니다. 그러나 실제 DB와 관련된 Repository 계층 등을 직접 주입받아야 했고, 이렇게 된다면 service 계층만의 단위 테스트를 제대로 하지 못할 것이라는 판단을 하였습니다. 따라서 Mockito를 사용하여 리팩토링하였는데, 이 과정을 포스팅하려 합니다. Service 계층 단위 테스트 - 기존의 코드 @SpringBootTest @Transactional(readOnly = true) @ExtendWith(MockitoExtension.class) class TicketInformationServiceTest { @Autowired private TicketInformationRepository tick..

백엔드/Spring 2023.10.17

[Spring] 서블릿과 스프링 MVC 패턴

이번 포스팅에서는 Spring에서 사용하는 서블릿이 무엇인가, 그리고 이와 관련하여 Spring은 어떤 동작을 하는지에 대해서 정리하려고 합니다. 서블릿 1. 서블릿의 개념 서블릿은 request, response을 통해 동작하는 프로그래밍 모델에서 웹 서버의 역할을 **확장**할 수 있도록 하는 자바 클래스입니다. 서블릿은 request를 받고 동적인 웹 페이지를 만들어 client에 응답합니다. *확장의 의미 정적인 리소스를 응답하는 웹 서버에 동적인 웹 페이지 응답을 전달하는 WAS의 역할을 하는 것입니다. WAS = 웹 서버 + 서블릿 Container 2. 서블릿의 동작 과정 순서 WAS의 서블릿 컨테이너가 Servlet 객체를 생성 Client가 해당 Servlet을 사용하는 http 요청을 ..

백엔드/Spring 2023.07.14

[Spring] 디렉터리 패키지 구조 구성하는 방법

스프링으로 프로젝트를 시작하려고 하는데, 어떻게 패키지의 계층 구조를 나눠야 효율적인지 궁금해졌습니다. 그래서 어떤 방법이 좋을지를 찾아보았는데, 이와 관련해 내용을 정리하려고 합니다. 계층형 디렉토리 패키지 구조 계층형 디렉토리 패키지 구조는 아래와 같이 3가지로 구분됩니다. 1. Web Layer: 사용자의 요청과 이에 대한 응답을 반환하는 처리가 일어나는 Layer 2. Service Layer: 실제 비지니스 로직이 일어나는 Layer로 Web Layer와 Repository Layer 사이에 있는 Layer 3. Repository Layer: DB와 통신하는 Layer 계층형 구조의 장점 1, 전체적인 프로젝트의 구조를 빠르게 파악할 수 있습니다. 계층형 구조의 단점 1. 각각 패키지 디렉토리..

백엔드/Spring 2023.03.13

[Spring] JSP 대신 Thymeleaf를 사용하는 이유

클라이언트에게 동적인 웹페이지를 보여주기 위해 JSP, Thymeleaf 등 다양한 방식이 있습니다. 스프링에서는 Thymeleaf를 권장하고, 최근 개발자들 또한 jsp 대신 thymeleaf를 사용하는 추세입니다. 그렇다면 그 이유는 무엇인지 thymeleaf의 장점을 중심으로 알아보는 시간을 가져보겠습니다. Thymeleaf의 장점 1. thymeleaf가 jsp에 비해 이상한 태그도 없고, 같은 의미를 가진 속성을 가지기 때문에 더 HTML 스럽습니다. 2. JSP와 달리 프로토타입 코드를 작성할 수 있습니다. 기존에 html 코드와 타임리프 코드를 동시에 사용할 경우, 타임리프가 이를 대체할 것임이 명백하기 때문입니다. JSP는 기존의 html 코드와 동시에 코드를 작성할 수 없어 프로토타입 코..

백엔드/Spring 2022.08.22

[Spring] 상품 상세, 등록폼, 등록 처리, 상품 수정

목차 1. 상품 상세 2. 상품 등록 폼 3. 상품 등록 처리(PRG) 4. 상품 수정 폼 5. 상품 수정 도메인 Item.class package spring.mvc.web.domain; import lombok.Data; @Data public class Item { private long id; private String itemName; private Integer price; private Integer quantity; public Item() { } public Item(String itemName, Integer price, Integer quantity) { this.itemName = itemName; this.price = price; this.quantity = quantity; }..

백엔드/Spring 2022.07.28

[Spring] 타임리프 실습

목차 1. 타임리프 문법 2. 관련 클래스 3. html, css 타임리프 문법 1) 타임리프 사용 선언 2) 타임리프 속성 변경 th:href="@{/css/bootstrap.min.css}" // 타임리프 속성 변경 href="../css/bootstrap.min.css" // 기존 타임리프 뷰 템플릿을 거치게 되면 서버렌더링을 통해 원래 값을 th:xxx로 변경하게 된다. 3) URL 링크 표현식 - @{...} th:href="@{/css/bootstrap.min.css}" 타임리프는 URL링크 사용시 @{...}를 사용한다. 이를 링크 표현식이라고 한다. 4) 상품 등록 폼으로 이동 속성 변경 th:onclick onclick="location.href='addForm.html'" // 기존 t..

백엔드/Spring 2022.07.26

[Spring] 스프링 HTTP 응답 하기

목차 1. 응답 - 정적 리소스, 뷰 템플릿 2. 응답 - HTTP API, 바디에 직접 입력 3. HTTP 메시지 컨버터 4. 요청 매핑 핸들러 어댑터 구조 응답 - 정적 리소스, 뷰 템플릿 스프링에서 응답 데이터를 만드는 방법은 총 3가지이다. 1) 정적 리소스 스프링 부트에서는 /static, /publc, /resources, /META-INF/resources 정보를 제공한다. src/main/resources는 리소스를 보관하는 곳이면서, 클래스 패스의 시작경로인 것이다. 따라서 위의 디렉토리에 리소스를 넣어두면 스프링 부트가 정적 리소스로 서비스를 제공하게 된다. 정적 리소스 경로 src/main/resources/static 만약 아래와 같은 경로에 파일이 있다고 하자 src/main/re..

백엔드/Spring 2022.07.22

[Spring] 스프링 HTTP 요청 받기

목차 1.로거 2. 요청 매핑 3. HTTP 요청 - 기본, 헤더 조회 4. HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form 5. HTTP 요청 파라미터 - @RequestParam 6. HTTP 요청 파라미터 - @ModelAttribute 7. HTTP 요청 메시지 - 단순 텍스트 8. HTTP 요청 메시지 - JSON 로거 개요 스프링 부트 라이브러리에는 logging이 포함되어있다. 기본적으로 SLF4J와 Logback 라이브러리를 사용한다. 로그 라이브러리에는 여러가지가 있는데, 이를 통합해 인터페이스로 제공하는 것이 SLF4J 라이브러리이다. 사용법 로그 선언 private Logger log = LoggerFactory.getLogger(getclass()); @Slf4j 롬복 ..

백엔드/Spring 2022.07.22

[Spring] 스프링 MVC - 구조 이해

목차 1. 스프링 구조 2. 컨트롤러 통합하기 3.실용적인 방식 1. 스프링MVC 구조 1) 개요 스프링은 위의 사진처럼 동작한다 . 동작 순서 1.핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다. 2. 핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다. 3.핸들러 어댑터 실행 4. 핸들러(컨트롤러) 실행 5. ModelView 반환: 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelView로 변환 후 반환한다. 6. viewResolver호출: 뷰 리졸버를 찾고 실행한다. 7. view 반환: 뷰 리졸버는 뷰의 논리 이름을 물리이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다 8. 뷰 렌더링: 뷰를 렌더링한다. 현재의 스프링은 어노테..

백엔드/Spring 2022.07.11
728x90