Spring 44

[Spring] 트랜잭션에 대한 이해와 과거의 활용

데이터를 저장할 때 단순 파일에 저장해도 되지만 현대의 웹 애플리케이션은 왜 데이터베이스에 저장할까? 이는 데이터베이스가 트랜잭션이라는 개념을 지원하기 때문이다. 현대의 우리는 스프링 프레임워크를 사용할 때 @Transactional 애노테이션을 통해 간단히 트랜잭션을 사용하지만, 과거 개발자들은 어떻게 트랜잭션을 사용했는지, 트랜잭션이란 무엇인지 알아보자. 트랜잭션이란? - 트랜잭션의 개념 트랜잭션은 사전적으로 하나의 업무 단위, 혹은 거래 단위를 뜻한다. 웹 애플리케이션에서의 트랜잭션은 무엇을 의미할까? 동일하게 하나의 거래 단위로 해석할 수 있다. 아래의 예시를 살펴보자. 상황 : A가 B에게 2000원을 입금한다. 1. A의 계좌정보를 불러온다. 2. A의 계좌에서 2000원을 출금한다. 3. B..

Spring 2023.12.13

[Spring] Connection Pool, DataSource

Connection Pool 이란? 이전 포스팅에서는 DriverManager를 통해서 커넥션을 얻어오는 과정을 알아봤다. 이러한 방식은 매번 새로운 커넥션을 생성하기 때문에 커넥션을 맺는 시간, 비용 등등.. 비효율적이라고 할 수 있다. 그래서 고안해낸 방식이 바로 Connection Pool이다. 위 사진처럼 애플리케이션이 시작하는 시점에 커넥션 풀은 필요한 만큼(기본 10개) 커넥션을 미리 확보해서 풀에 보관한다. 커넥션 풀에 들어 있는 커넥션은 TCP/IP로 DB와 커넥션이 연결외어 있는 상태이므로 언제든지 즉시 SQL을 DB에 전달할 수 있다. 애플리케이션은 이제 DriverManager를 통해서 매번 커넥션을 획득하지 않고, 커넥션 풀에 미리 생성되어 있는 커넥션을 가져다 쓰기만 하면 된다. ..

Spring 2023.12.07

[Spring] JDBC에 대한 이해

JDBC가 등장한 이유 과거에는 수 십개의 관계형 데이터베이스마다 커넥션을 획득하고(Connection), SQL을 담아서 DB에 전달하고(Statement), 결과를 응답받는(ResultSet) 과정이 모두 달랐다. 그래서 데이터베이스를 변경하면 많은 번거로움이 있을 수 밖에 없었다. '굳이 매번 번거롭게 사용해야해? 통일된 느낌으로 만들 수 없나?' 라는 생각에서 등장한 것이 바로 JDBC 표준 인터페이스이다. 개발자들은 JDBC 표준 인터페이스의 규칙에 맞춰 사용하면 되고, 내부적으로는 각 DB 벤더 회사들이 제공해주는 JDBC 드라이버를 이용해 구현체를 생성하게 된다. 이렇게 JDBC 인터페이스를 통해 한 단계 추상화를 거치면서 다음과 같은 두 가지의 이점이 생겼다. 애플리케이션 로직은 이제 JD..

Spring 2023.12.07

[Spring] 예외 처리와 오류 페이지

사용자가 잘못된 URL로 접근하거나 서버 내부에서 문제가 발생하는 경우 사용자는 404 Not Found와 같은 오류 페이지를 만나게 된다. 아무래도 일반적인 사용자 입장에서 알 수 없는 오류가 가득 적힌 페이지를 마주하게 된다면 무슨 문제 때문인지 파악하기 어려울 것이다. 실제 이런 오류 페이지가 잘 설계된 웹 사이트를 보면 오류 페이지도 깔끔하고 무슨 문제가 있는지 잘 보여준다. 이런 예외 상황들을 어떻게 처리하고 오류 페이지를 사용자에게 보여주는 방법들에 대해서 알아보자. 예외 처리는 스프링 기술을 사용하지 않은 순수 서블릿 컨테이너에서의 예외 처리, 스프링이 지원하는 예외 처리 두 가지 방식에 대해서 알아볼 것이다. - 서블릿의 예외 처리 서블릿은 다음 두 가지 방식으로 예외 처리를 지원한다. X..

Spring 2023.07.28

[Spring] 로그인 처리 - 서블릿 필터, 스프링 인터셉터

지난 포스팅 : https://dong-woo.tistory.com/98 [Spring] 로그인 처리 - 쿠키, 세션 - 요구사항 홈 화면 요구사항 홈 화면은 로그인 전과 후로 구분되어야 한다. 로그인 전 로그인 후 보안 요구사항 로그인 사용자만 상품관리에 접근하고, 관리할 수 있어야 한다. 로그인 하지 않 dong-woo.tistory.com 지난 포스팅에서 쿠키와 세션을 사용해 로그인 상태를 유지하는 방법에 대해서 알아봤다. 하지만 아직 적용시키지 못한 요구사항이 존재한다. 상품 관리 페이지는 로그인 한 상태로만 접근할 수 있어야 하는데, URL로 직접 접근하게 되면 세션에 로그인 정보가 남아있지 않아도 상품 관리 페이지로 이동할 수 있는 문제가 발생한다. 이런 문제를 해결하기 위해서는 특정 페이지에..

Spring 2023.07.27

[Spring] 로그인 처리 - 쿠키, 세션

- 요구사항 홈 화면 요구사항 홈 화면은 로그인 전과 후로 구분되어야 한다. 로그인 전 로그인 후 보안 요구사항 로그인 사용자만 상품관리에 접근하고, 관리할 수 있어야 한다. 로그인 하지 않은 사용자가 상품관리에 접근하면 로그인 화면으로 이동해야 한다. - 메인 홈 화면 로그인 하지 않았을 때 기본적으로 보여줄 홈 화면과 로그인 시 보여줄 홈 화면, 2개의 뷰를 따로 개발한다. - 회원가입 검증기능을 포함한 Member 도메인 클래스를 만든다. MemberRepository에 회원 저장, 조회기능을 개발한다. 이전에 상품 도메인을 개발한 것과 매우 유사한 형태이다. 이제 MemberController를 개발한다. @GetMapping 요청이 들어오면 회원가입 폼을 반환해준다. @PostMapping 요청..

Spring 2023.07.26

[Spring] 애노테이션 기반의 Bean Validation

지난 포스팅 : https://dong-woo.tistory.com/94 [Spring] 유효성 검증 - Validation 지금까지 만든 웹 애플리케이션은 폼 입력 시 바인딩 오류가 발생하면 400 Bad Request 화면으로 이동했다. 아마 사용자 입장에서 이런 오류 페이지를 만난다면 당황할 것이다. 또한 입력값을 공백 dong-woo.tistory.com 지난 포스팅에서 유효성 검증, Validation 방식에 대해 점진적인 발전을 거치며 살펴봤다. 하지만 코드가 복잡하다. 자바는 Bean Validation이라는 애노테이션 기반의 검증 방식을 지원해 보다 간단한 코드로 검증 로직을 구현할 수 있다. Bean Validation에 대해 알아보자. - Bean Validation 이란 @NotNul..

Spring 2023.07.25

[Spring] 유효성 검증 - Validation

지금까지 만든 웹 애플리케이션은 폼 입력 시 바인딩 오류가 발생하면 400 Bad Request 화면으로 이동했다. 아마 사용자 입장에서 이런 오류 페이지를 만난다면 당황할 것이다. 또한 입력값을 공백으로 비워놔도 정상처리가 됐다. 웹 서비스는 폼 입력 시 오류가 발생하면, 고객이 입력한 데이터를 유지한 상태로 어떤 오류가 발생했는지 알려주는 것이 기본이다. 입력값의 유효성을 검증하고 처리하는 기능을 추가해보자. 순수 자바 코드로 검증 로직을 처리하는 것을 시작으로, 스프링이 지원하는 검증 기능을 적용하는 단계까지 점진적으로 발전시켜 나가볼 것이다. - 요구사항 추가 상품 관리 웹 애플리케이션에 새로운 요구사항이 추가되었다. 아래의 사진과 같이 유효성 검사를 해야한다. 타입 검증 가격, 수량은 Integ..

Spring 2023.07.21

[Spring] 메시지, 국제화 기능

- 메시지 기능 소개 웹 애플리케이션 개발을 거의 완성하던 중, 한 기획자가 말을 걸어온다. "개발자님~ 모든 웹 페이지에 상품명이라고 보이는 단어를 전부 상품이름으로 바꿔주세요~ 금방 가능하죠?" 정말 당황스럽다. 상품명이 들어가는 화면만 수십개 이상인데.. 수십개의 HTML파일을 모두 고쳐야하나? 만약 단순하게 HTML 파일에 메시지가 하드코딩 되어 있다면 정말 하나하나 고쳐야한다. 이러한 상황을 대비해, 메시지 기능이란 것을 활용한다면 정말 단순하게 모든 파일을 고칠 수 있다! 메시지 기능이란, 다양한 메시지를 한 곳에서 관리하도록 하는 기능이다. 아래 예시를 보자. item=상품 item.id=상품 ID item.itemName=상품명 item.price=가격 item.quantity=수량 이렇게..

Spring 2023.07.19

[Spring] 타임리프(Thymeleaf)와 스프링의 통합

지난 포스팅에서 개발해본 간단한 상품 관리 웹 애플리케이션을 조금 더 고도화 해볼 것이다. 스프링과 타임리프는 입력 폼을 매우 효율적으로 처리하기 위한 기능들을 제공한다. 해당 기능을 알아보고 프로젝트에 추가된 요구사항에 맞춰 애플리케이션을 개선해보자. 지난 포스팅 : https://dong-woo.tistory.com/86 - 입력 폼 처리 (th:object, th:field) HTML의 폼을 통해 데이터를 전송할 때 보면 다음과 같은 구조를 갖는다. 상품명 input 타입으로 데이터를 넘길 때 보면 id, name과 같은 속성들이 있다. 무엇을 의미할까? id : HTML 안에서 식별하는 고유한 id name : 서버로 데이터가 전송될 때, 서버에서 식별하기 위한 이름 value : 서버로 데이터가..

Spring 2023.07.19