[Spring] 영속성 컨텍스트에 대해 정리해보자
·
Programming/Spring
영속성 컨텍스트Spring Framework에서 영속성 컨텍스트란 어플리케이션 엔티티를 관리하는 환경으로,어플리케이션과 데이터베이스 사이에서 객체를 보관/관리하는 저장소 역할을 한다.트랜잭션 단위로 관리된다.애플리케이션 단위가 아니라 트랜잭션 단위로 관리된다.즉, 트랜잭션이 끝나면 해당 영속성 컨텍스트가 사라지면서 관리되던 엔티티는 준영속 상태가 된다.같은 트랜잭션 내에서는 같은 영속성 컨텍스트를 사용한다.하나의 Spring 어플리케이션에서 여러 개의 영속성 컨텍스트가 존재할 수 있다.누가 관리하는가?`EntityManagerFactory` : 애플리케이션 전체에서 하나만 생성되는 팩토리 객체 (싱글톤)`EntityManager` : 영속성 컨텍스트를 직접 관리하는 JPA 핵심 객체 얘로 영속성 컨텍스..
[Spring] Interceptor에 대해 알아보자
·
Programming/Spring
Spring Interceptor란?Spring MVC에서 제공하는 기능으로, 특정 요청이 컨트롤러에 도달하기 전이나 응답이 클라이언트에게 반환되기 전에 추가적인 처리를 수행할 수 있도록 도와준다.이를 통해 인증, 로깅, 공통 처리 로직등을 분리해서 유지보수성을 높일 수 있다.구현하는 법spring-web 5.3 이하 버전에서는`HandlerInterceptorAdaptor` 클래스를 상속`HandlerInterceptor` 인터페이스를 구현함으로써 인터셉터를 생성할 수 있었다.그러나 5.4 버전 이후부터는 `HandlerInterceptorAdaptor` 클래스가 deprecated 처리되어 `HandlerInterceptor` 인터페이스를 구현하는 방식으로 인터셉터를 만들어야 한다.☑️  Spring..
[Spring] LoginCheckFilter 구현 : 로그인/아웃 로직 구현하기
·
Programming/Spring
Filter 알아보기Filter 실행 흐름HTTP 요청 → WAS → `Filter 1 → Filter 2 → ... → Filter N` → Servlet → Controller Servlet이 호출되기 전에 Filter를 항상 거치게 된다.따라서 Controller에서 수행할 공통 관심 사항을 Filter에 구현하면 모든 요청 혹은 응답에 적용할 수 있다.특정 URL Pattern에만 Filter를 등록할 수도 있다.Filter의 구현Filter Interface`jakarta.servlet.Filter` 인터페이스를 구현하여야 한다.주요 메서드는 `init`, `doFilter`, `destroy`로 이루어져 있다.HTTP 요청이 오면 `doFilter` 메서드가 호출된다.  ← 원하는 로직을 이 ..
[Spring] 기본 예외 처리와 Custom 예외 처리 함께 사용하기
·
Programming/Spring
일정 관리 앱 과제를 수행하면서 예외 처리를 커스텀 하는 법에 대해서 공부했다.짧게 다시 복기해보자면 !커스텀 예외 처리 방법가장 명시적으로 예외 처리는 `try-catch` 문으로 할 수 있다. 그렇지만 예외가 발생할 수 있는 모든 부분에 `try-catch` 문을 덕지덕지 붙일 수는 없다 .. (아무도 보고 싶지 않아하는 누더기 같은 코드가 될 수 있음) Spring에서는 어플리케이션을 실행하는 동안 특정 예외가 발생할 경우 개발자가 등록한 특정 메서드를 실행시켜 주는 기능을 제공한다. (🙇🏻‍♀️🙇🏻‍♀️)해당 메서드에는 `@ExceptionHandler` 어노테이션을 달아주면 된다. 이 `@ExceptionHandler` 어노테이션안에 담당할 예외 클래스들을 명시해준다.@ExceptionH..
[Spring] JDBC 이해하기
·
Programming/Spring
JDBC란?JDBC (Java DataBase Connectivity)Java 표준 API로 , SQL 쿼리를 실행하고 결과를 가져오는 등의 데이터베이스 관련 작업을 수행하도록 하는 인터페이스와 클래스들의 집합Java를 사용하여 DB와 상호작용하기 위해 가장 오래 & 널리 사용된 Java의 표준 API이다.JDBC만 사용하여 데이터베이스와 상호작용하는 것은 가능하지만, 다음과 같은 문제점이 생긴다.예외처리가 번거롭다. SQLException 예외 처리를 위해 Try-Catch 블록을 여러 곳에 작성해야 한다.Connection, Statement, ResultSet 객체를 사용한 뒤 반드시 close() 메서드를 호출하여야 한다. 이처럼 자원 누수를 방지하기 위해 많은 자원 관리 코드를 작성해야 한다.쿼..
Servlet 이해하기 (Web Server, WAS, Servlet)
·
Programming/ETC
Web ServerHTTP 기반으로 동작하며 정적 리소스를 제공한다.대표적인 웹 서버ApacheNGINX등등WAS (Web Application Server)웹 서버의 기능에 + DB 조회를 포함하여 다양한 로직에 대한 처리를 함께 한다. 추가적인 코드 실행을 통해 어플리케이션 로직을 수행하고 동적 컨텐츠를 생성한다.대표적인 WASApache Tomcat (Spring Boot에 내장)Eclipse Jetty등등실제 웹 시스템 구성 (Web Server과 WAS의 관계)정적 데이터에 대한 요청은 Web Server에서 바로 처리하여 응답한다.ex) 요청 경로가 `/public/images/logo.png` -> 정적 리소스로 처리, 바로 응답그 외의 경우 Web Server가 Http Request를 W..
[Java] HashMap 파헤쳐보기 (키오스크 과제 : 장바구니 구현기)
·
Programming/Java
이번 키오스크 과제를 하면서는 설계를 하는 데에 많은 고민을 했다.어떤 클래스를 만들까? 이 클래스가 어떤 역할까지를 맡는 것이 맞을까?어떤 메서드를 만들까? 이 메서드가 어떤 기능까지 수행하는 것이 맞을까?와 같이 역할을 분리하는 데에,특히 사용자와 상호작용 하는 부분과 내부 비즈니스 로직을 어떤 클래스에 어떤 메서드로 분할할 지를 많이 고민했다.또 나의 코드를 읽는 이로 하여금 쉽게 이해할 수 있는 코드를 짜려고 노력을 했다. 결과적으로 시원하게 모든 고민들을 해결했다고 말할 순 없지만(애초에 가능한가?), 고민하면서 전체 코드에 대거 변화가 일어나기도 했다. 일단 구현을 하면서 마주쳤던 고민들과 공부 내용, 해결했던 방법들을 정리해보자.들어가기 앞서 ...우선 필수기능까지 구현한 기존의 프로젝트 구..
[Java] Stream 함수에서 인덱스 사용하기 (키오스크 과제)
·
Programming/Java
💥 Stream 함수에서 인덱스 사용발단 : forEach() 에서 인덱스 정보가 필요해!`기존에 생성한 Menu의 MenuItem을 조회 할 때 스트림을 사용하여 출력하도록 수정`하라는 요구사항에 맞게, `Menu` class의 `printMenuItems()` 메서드를 변경하고자 하였다.기존 코드 // List에 들어있는 MenuItem을 순차적으로 보여주는 함수 public void printMenuItems() { for(int i=0; i위 함수를 실행하면 다음과 같이 인덱스와 함께 메뉴 아이템의 정보가 출력된다.1. ShackBurger | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거2. SmokeShack | W 8.9 | 베이..
[MySQL] DATE 데이터 다루기
·
Programming/Database
지정 형식으로 문자열 반환DATE_FORMATDATE_FORMAT(컬럼명, 형식) : 지정한 형식대로 구성된 `문자열`을 반환한다.형식 예시 : `'%Y-%m-%d'` -> `2000-06-20`기호 %Y4자리 년도%y2자리 년도%M영문 월%m숫자 월 (2자리)%c숫자 월 (한 자리 수는 한 자리로)%d일 (2자리)%e일 (한 자리 수는 한 자리로)%W긴 요일 이름 (ex. MONDAY)%a짧은 요일 이름 (ex. MON) 년/월/일 정수로 반환원하는 날짜 데이터를 뽑아 `정수`로 반환한다.YEAR(컬럼명)년도 반환MONTH(컬럼명)월 반환DAY(컬럼명)일 반환
🧐 계산기 과제를 마무리하는데 생겨난 궁금증 : Generics 사용
·
Programming/Java
Generics의 사용Generics를 사용해서 기존엔 int였던 피연산자 타입을 double로도 받아올 수 있도록 하는 것이 Lv.3의 요구사항 중 하나였다.내가 구현한 내용은 다음과 같다.public class ArithmeticCalculator { private final List result = new LinkedList(); public Double calculate(T firstNum, T secondNum, String operator) { double result = OperatorType.fromSymbol(operator).operate(firstNum,secondNum); setResult(result); return result; ..
계산기 과제 : 계산 결과 Lambda&Stream 필터링 조회 구현하기
·
Programming/Java
Lv.3 의 구현사항계산기 클래스의 메서드 calculate의 피연산자로 모든 타입의 숫자를 받아올 수 있어야 한다. (int, double, 양수, 음수)enum 으로 연산자 타입을 관리하고 활용한다.계산기에 저장된 연산 결과를 Lambda & Stream을 활용하여 조건에 맞도록 조회하는 메서드를 구현한다.오늘은 어제 1,2를 구현하면서 대강만 짜놨던 3번 요구사항을 세부 구현해보았다.어제는 아래 코드와 같이 메서드를 하나만 추가해놨었다. public void printResultGreaterThan(Number value) { String str = result.stream() .filter(v -> v > value.doubleValue()) ..
[Java] 추상클래스 vs 인터페이스, 언제 어떤 것을 사용할까?
·
Programming/Java
추상 클래스`class` 앞 `abstract` 키워드 사용추상 메서드를 포함한 클래스그러나 추상 메서드를 포함하지 않더라도 abstract 키워드를 통해 추상 클래스 처리가 가능하다. ( -> 인스턴스 생성 불가하도록 만들 수 있음)기존 클래스처럼 멤버변수와 메서드, 생성자를 가질 수 있음인스턴스를 생성할 수 없음추상 클래스를 상속받는 클래스는모든 추상 메서드를 구현하여 인스턴스 생성이 가능한 `클래스`가 되거나,모든 추상 메서드를 구현하지 않은 경우 `추상 클래스`가 된다.인터페이스오직 `추상 메서드`와 `상수`만을 멤버로 가진다 ( *default/static 메서드 예외 )모든 메서드는 `public abstract`모든 멤버 변수는 `public static final`인스턴스를 생성할 수 없음..