본문 바로가기

분류 전체보기64

[DataBase] 트랜잭션 (Transaction)2 애플리케이션 구조 애플리케이션은 3가지 계층으로 나눌 수 있다. Controller, Service, Repository 프레젠테이션 계층 (Controller) - UI와 관련된 처리 담당 - 웹 요청과 응답 - 사용자 요청을 검증 - 사용 기술: Servlet, HTTP 같은 웹 기술, 스프링 MVC 서비스 계층 (Service) - 비즈니스 로직 담당 - 사용 기술: 특정 기술에 의존하지 않고, 순수 자바 코드로 작성 데이터 접근 계층(Repository) - 실제 데이터베이스에 접근하는 코드 - 사용 기술: JDBC, JPA, File, Redis, Mongo ... 이 중 가장 중요한 곳은 서비스 계층이다. 서비스 계층은 시간이 흘러 UI(웹)와 관련된 부분이 변하고, 데이터 저장 기술이 다른 .. 2023. 9. 19.
[DataBase] 트랜잭션 (Transaction) 트랜잭션 (Transaction)이란? 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다. 커밋(Commit): 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것 롤백(Rollback): 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것 트랜잭션 ACID 원자성(Atomicity) 트랜잭션 내에서 실행한 작업들은 하나의 작업인 것 처럼 모두 성공하거나 모두 실패 일관성(Consistency) 모든 트랜잭션은 일관성 있는 데이터베이스 상태 유지, 무결성 제약 조건을 항상 만족 격리성(Isolation) 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리, 동시에 같은 데이터 수정 X 지속성(Durability) 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 함.. 2023. 9. 18.
[DataBase] Connection Pool / DataSource 커넥션 풀(Connection Pool)이란? 데이터베이스 커넥션을 획득할 때 과정 1. 애플리케이션 로직이 DB 드라이버를 통해 커넥션 조회 2. DB 드라이버가 DB와 TCP/IP 커넥션 연결 3. DB 드라이버는 TCP/IP 커넥션이 연결되면 ID, PW등 기타 부가정보 DB에 전달 4. DB는 ID, PW를 통해 내부 인증 후, 내부에 DB 세션 생성 5. DB는 커넥션 생성이 완료되었다는 응답 전송 6. DB 드라이버는 커넥션 객체를 생성 후 클라이언트에 반환 이러한 방법은 과정도 복잡하고, 시간도 많이 소모된다. 이를 해결하기 위한 아이디어가 바로 커넥션을 미리 생성해두고 사용하는 커넥션 풀 이라는 방법이다. 커넥션 풀 동작 방식 어플리케이션을 시작하는 시점에 커넥션 풀은 필요한만큼 커넥션을 .. 2023. 9. 14.
[DataBase] JDBC란? JDBC 이해 JDBC 등장 이유 애플리케이션을 개발할 때 중요한 데이터는 대부분 데이터베이스에 보관한다. 클라이언트가 애플리케이션 서버를 통해 데이터를 저장하거나 조회하면, 애플리케이션 서버는 다음 과정을 통해 데이터베이스를 사용한다. 1. 커넥션 연결: 주로 TCP/IP를 사용해서 커넥션을 연결한다. 2. SQL 전달: 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다. 3. 결과 응답: DB는 전달된 SQL을 수행하고 그 결과를 응답한다. 애플리케이션 서버는 응답 결과를 활용한다. 각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 그리고 결과를 응답 받는 방법이 모두 다르다. 1. 데이터베이스를 다른 종류의 데이터베이스로 변경하면 애플리.. 2023. 9. 13.
[MVC 패턴] API 예외 처리 API 예외 처리 - 스프링 부트 기본 오류 처리 @RequestMapping(produces = MediaType.TEXT_HTML_VALUE) public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {} @RequestMapping public ResponseEntity error(HttpServletRequest request) {} - errorHtml(): produces = MediaType.TEXT_HTMl_VALUE: 클라이언트 요청의 Accept 헤더 값이 text/html인 경우에는 errorHtml()을 호출해서 view를 제공한다. - error(): 그 외 경우에 호출되고 Resp.. 2023. 9. 4.
[MVC 패턴] 예외 처리와 오류 페이지 서블릿 예외 처리 1. Exception(예외) 2. response.sendError(HTTP 상태코드, 오류 메시지) Exception(예외) 1. 자바 직접 실행 자바의 메인 메서드를 직접 실행하는 경우 main이라는 이름의 쓰레드가 실행된다. 실행 도중 예외를 잡지 못하고 처음 실행한 main 메서드를 넘어서 예외가 던져지면, 예외 정보를 남기고 해당 쓰레드는 종료된다. 2. 웹 어플리케이션 웹 어플리케이션은 사용자 요청별로 별로의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 실행된다. 컨트롤러(예외 발생) → 인터셉터 → 서블릿 → 필터 → WAS package hello.exception.servlet; import lombok.extern.slf4j.Slf4j; import org.spring.. 2023. 9. 1.
[MVC 패턴] 로그인 처리2 - 필터, 인터셉트 서블릿 필터 필터흐름 HTTP 요청 → WAS → 필터 → 서블릿 → 컨트롤러 필터 제한 HTTP 요청 → WAS → 필터 → 서블릿 → 컨트롤러 //로그인 사용자 HTTP 요청 → WAS → 필터(적절하지 않은 요청이라 판단, 서블릿 호출X) //비 로그인 사용자 필터에서 적절하지 않은 요청이라고 판단하면 필터에서 끝을 낼 수 있다. 따라서 로그인 여부를 체크하기 좋다. 필터 체인 HTTP 요청 → WAS → 필터1 → 필터2 → 필터3 → 서블릿 → 컨트롤러 필터는 체인으로 구성되며, 중간에 필터를 자유롭게 추가할 수 있다. 필터 인터페이스 public interface Filter { public default void init(FilterConfig filterConfig) throws Servl.. 2023. 8. 31.
[MVC 패턴] 로그인 처리1 - 쿠키, 세션 로그인 처리하기 - 쿠키 사용 로그인 상태를 유지하기 위한 방법에는 쿼리 파라미터를 계속 유지하면서 보내는 방법이 있다. 하지만 이 방법은 매우 어렵고 번거로운 작업이기 때문에 쿠키를 사용한다. 서버에서 로그인에 성공하면 HTTP 응답에 쿠키를 담아서 브라우저에 전달 후 브라우저는 해당 쿠키를 지속해서 보내준다. 쿠키 종류 쿠키에는 영속 쿠키와 세션 쿠키가 존재한다. 영속 쿠키: 만료 날짜를 입력하면 해당 날짜까지 유지 세션 쿠키: 만료 날짜를 생략하면 브라우저 종료시 까지만 유지 브라우저 종료시 로그아웃 되길 원하므로, 세션 쿠키가 필요하다. 쿠키 생성 로직 //쿠키에 시간 정보를 주지 않으면 세션 쿠키(브라우저 종료시 모두 종료) Cookie idCookie = new Cookie("memberId".. 2023. 8. 29.
[MVC 패턴] 검증2 - Bean Validation Bean Validation - Bean Validation은 특정한 구현체가 아닌 Bean Validation 2.0(JSR-380)이라는 기술 표준이다. - 검증 애노테이션과 여러 인터페이스의 모음이다. 스프링 MVC에서 Bean Validator 사용하는 방법 스프링 부트가 spring-boot-starter-validation 라이브러리를 넣으면 자동으로 Bean Validator를 인지하고 스프링에 통합한다. implementation 'org.springframework.boot:spring-boot-starter-validation' Bean Validation 애노테이션 적용 코드 package hello.itemservice.domain.item; import lombok.Data; im.. 2023. 8. 24.
[MVC 패턴] 검증1 - Validation 컨트롤러의 중요한 역할 중 하나는 HTTP 요청이 정상인지 검증하는 것이다. * 클라이언트 검증, 서버검증 클라이언트 검증은 조작할 수 있으므로 보안에 취약하다. 서버만으로 검증하면, 즉각적인 고객 사용성이 부족해진다. 둘을 적절히 섞어서 사용하되, 최종적으로 서버 검증은 필수이다. API 방식을 사용하면 API 스펙을 잘 정의해서 검증 오류를 API 응답 결과에 잘 남겨주어야 한다. 상품 등록 검증 코드 @PostMapping("/add") public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes, Model model) { //검증 오류 결과를 보관 Map errors = new HashMap(); //.. 2023. 8. 24.