목록Programming Language/Java (14)
091
1. Thymeleaf(타임리프) - 타임리프란 서버사이드 템플릿 엔진으로, Spring MVC에서 컨트롤러가 모델에 데이터를 담아 뷰로 보내면, 타임리프가 그 데이터를 HTML에 끼어 넣어서 완성된 페이지를 만듭니다.-> 기존 jsp와 비슷한 역할인데, Spring Boot에서는 타임리프를 공식 권장합니다. 두 가지의 핵심적인 차이는 jsp는 브라우저에서 직접 여는 게 불가능하지만, 타임리프는 내추럴 템플릿으로 가능합니다. - 타임리프에서는 th:속성을 HTML 태그에 붙이는 방식을 주로 활용합니다. 예를 들면 HomeController에서 메인 인덱스 파일로 매핑해줄 때 모델 객체를 통해 변수를 출력해주면, 쿼리 스트링으로 링크에 p의 값을 지정해주면, 아래 html에서 th:text에 해당값이 들어..
0. 3 Layer Architecture - @Component 계열의 Bean인 @RestController(@Controller), @Service, @Repository는 이 3계층 아키텍처의 흐름에서 Presentation Layer, Service Layer, Data Access Layer에 해당합니다. -> DTO(Data Transfer Object)는 데이터를 전달하기 위해 사용하는 객체입니다. Entity는 ORM 구조에서 DB의 테이블과 매핑되어 실제로 데이터를 관리하는 객체입니다. 이렇게 데이터를 다루는 객체를 굳이 두개로 쪼갠 이유는 이전에 JDBC를 사용하던 시절에는 쿼리를 날리고 결과를 받아서 데이터를 담을 수 있는 객체에 일일이 넣어줬지만, Entity와 DTO가 지금처럼 ..
1. JPA(Java Persistence API) - 이전 자바에서는 JDBC(Java DataBase Connectivity)라는 DB와 연결하는 API를 사용했습니다. SQL작성, 객체 변환 등을 직접 수행했어야했고 반복적으로 같은 코드를 작성했어야했기 때문에, 비지니스 로직보다 DB 코드 무게가 더 무거워지는 문제가 발생했습니다. 그 뒤로는 SQL Mapper로 MyBatis가 등장했습니다. 이는 SQL을 직접 작성하지만 매핑을 자동화하여 이전 JDBC보다 훨씬 편해졌지만 객체 지향 구조와 따로 논다는 불편함이 여전히 존재했습니다.user.getTeam().getName(); //객체 참조SELECT * FROM user uJOIN team t ON u.team_id = t.id //DB 접근->..
*이 글은 프로젝트 KINO CINEMA의 개발 내용을 정리해놓은 글입니다.*3. SeatCommandService(with SeatService) & ReservationCommandService - SeatService: CQRS에서 읽기(Query)에 해당하는 로직이 들어가 있는 비지니스 로직입니다.package com.cinema.kino.service;//import문 생략@Service@Transactional(readOnly = true)@RequiredArgsConstructorpublic class SeatService { private final ScreeningSeatRepository screeningSeatRepository; private final ScreeningR..
*이 글은 프로젝트 KINO CINEMA의 개발 내용을 정리해놓은 글입니다.*2. SeatSelectRequestDTO & SeatStautsResponseDTO->SeatBookingResponseDTO - SeatSelectRequestDTO: 클라이언트에서 서버로 요청하는 데이터로, 이름 그대로 선택된 좌석과 관련된 자료가 넘어옵니다.package com.cinema.kino.dto;//import문 생략@Getter@Setterpublic class SeatSelectRequestDTO { private Long screeningId; private Long memberId; private Long guestId; private List tickets; @Getter @..
*이 글은 프로젝트 KINO CINEMA의 개발 내용을 정리해놓은 글입니다.*0. 설계 - 초반에 예약부분을 고려하지 못하고 3명의 팀원끼리 티켓팅 부분, 좌석 선점, 결제를 메인으로 풀스텍으로 짠 뒤, 전체 흐름을 합치는 방식을 선택했었습니다. 합산하는 과정에서 좌석 선점 -> 결제로 넘어갈 때 페이지는 필요없지만 서버에서 예약 로직이 필수적이라고 판단됐고 그러면서 초반에 짰던 것과는 다른 차이가 생겼습니다. 그 차이가 바로 원래는 좌석을 선택하는 동시에 좌석 상태가 AVAILABLE에서 HELD로 변하는 양방향 형식이었다면, 예약 로직이 들어오고 난 뒤로는 예약하기 버튼을 눌러서 결제 페이지로 넘어가는 과정에서 HELD로 바뀌고 이후에 선점된 결과만 가볍게 브로드캐스팅하는 형식이 되었습니다. -> 그..
1. Spring과 WebSocket - Spring에서는 모든 요청에 DispatcherServlet이라는 Front Controller에 들어오며, 이때 들어온 HTTP 요청 헤더에 Upgrade: websocket 존재 여부를 판단합니다. 일반적인 REST API 라우팅이 아닌 WebSocket 전용 처리기인 WebSocketHttpRequestHandler로 요청을 위임하여 3-way handshake 및 101 Switching Protocols 응답을 수헹힙니다. (1) 순수 WebSocket: - 스프링에서 제공하는 WebSocketHandler와 WebSocketSession 만을 이용하여 실시간 통신 서버를 구축하는 순수 WebSocket 방식은 생산성 저하나 구조적 결함을 야기하는 방식..
Spring Boot = Spring Framework + Auto Configuration (자동 설정) + 내장 서버 (Tomcat 등) + Starter (의존성 모음)1. IoC(Inversion of Control) - IoC는 제어의 역전을, 객체 생성과 관리 책임을 개발자가 아닌 프레임워크가 가지는 Spring Framework의 대표적인 특징을 말합니다.//1️⃣[Spring에서 사용되지 않는 객체 직접 생성]UserService service = new UserService();//2️⃣[Spring IoC, 이전 권장 방식인 필드주입]@Servicepublic class UserService { @Autowired private UserRepository userReposit..