Java 44

Command 패턴

1️⃣ Command 패턴이란? Command 패턴은 요청(명령)을 객체로 캡슐화하여 실행, 취소, 저장 등을 관리할 수 있도록 하는 디자인 패턴즉, "어떤 작업을 실행하는 코드"를 하나의 객체로 만들고, 이를 실행/취소/보관할 수 있도록 하는 패턴 📍 Command 패턴의 핵심 개념명령을 객체(Command)로 만들어 독립적으로 다룸명령을 실행하는 대상(Receiver)과 실행을 요청하는 객체(Invoker)를 분리 명령을 저장하고 나중에 실행 가능Undo(실행 취소) 기능을 쉽게 구현2️⃣ Command 패턴의 구조Command 패턴은 다음과 같은 5가지 주요 컴포넌트로 구성🔹 1. Command (명령 인터페이스)실행할 작업을 정의하는 인터페이스모든 명령은 execute() 메서드를 구현실행 취..

Java/Spring 2025.03.17

Spring에서 @Transactional

Spring에서 @Transactional은 AOP(Aspect-Oriented Programming)를 사용하여 트랜잭션을 처리 @Transactional의 동작 방식AOP Proxy 생성:Spring은 @Transactional이 선언된 메서드나 클래스에 대해 AOP 프록시를 생성이 프록시는 원래의 메서드를 감싸는 대리 객체로, 실제 메서드 호출 전에 트랜잭션을 시작하고 메서드 실행 후에 트랜잭션을 커밋하거나 롤백트랜잭션 시작:트랜잭션을 관리하는 AOP 프록시는 메서드 호출 전에 트랜잭션을 시작이때 트랜잭션 관리자는 데이터베이스 연결을 확보하고, 트랜잭션 상태를 관리메서드 실행:AOP 프록시가 실제 메서드를 호출이 메서드는 비즈니스 로직을 처리트랜잭션 커밋 또는 롤백:메서드 실행이 성공적으로 완료되면..

Java/Spring 2025.03.12

Proxy 패턴

Proxy Pattern은 객체에 대한 접근을 제어하기 위해, 해당 객체를 감싸는(즉, 대리 객체) 역할을 하는 디자인 패턴 - 실제 객체에 직접 접근하는 대신 프록시 객체를 통해 간접적으로 접근- 프록시 객체는 실제 객체를 대신해 특정 작업을 수행하거나, 실제 객체에 대한 접근을 제어 가능 - 초기화 지연, 접근제어, 로깅, 캐싱 등 다양하게 사용 가능프록시 패턴의 구조Subject: 실제 객체가 구현해야 하는 인터페이스- 프록시 객체와 실제 객체가 공유하는 공통의 인터페이스로, 프록시 객체는 이 인터페이스를 구현RealSubject: 실제로 기능을 수행하는 객체- Subject 인터페이스를 구현하여, 실제 비즈니스 로직을 처리Proxy: Subject 인터페이스를 구현- 실제 객체에 대한 접근을 제어..

Java/Spring 2025.03.12

[ERROR] javax.servlet.ServletRequest.getRemoteAddr() is not supported

[이슈 당시 상황] Back단 java application, Front단 react, nextjs를 사용해서 프로젝트를 진행 AWS EC2 인스턴스로 배포 하고, Route 53으로 DNS 연결을 하고 ACM 으로 SSL 연결 해당 EC2를 443 포트로 로드밸런싱을 처리 [이슈 내용] 특정 IP만 접속 가능하도록 설정 해두었는데, 해당 IP으로 접근이 되지 않고 javax.servlet.ServletRequest.getRemoteAddr() is not supported 에러가 발생. [해결 방안] 일반적으로 Spring Security의 인증 과정에서 HttpServletRequest를 사용하여 클라이언트의 IP 주소를 가져올 수 있습니다. 그러나 특정 환경에서는 getRemoteAddr() 메서드..

Java/Spring 2023.06.28

@Transactional 적용 안된 현상 정리

한 serviceImpl 안에서 insert로직이 2번 이루어 질때 하나의 로직이 실패 할시에 Transaction으로 rollback을 할 계획 이었다. 하지만 전에 진행하던 프로젝트와 똑같은 방법으로 진행하였지만 rollback이 안되고 exception이 일어나기 전까지의 로직이 수행되어서 DB에 저장되었는데 그 과정을 처리했던 방법 정리 구글링을 통해서 1. Checked Exception일 경우 2. 한 클래스 내 @Transaction이 설정되어있지 않은 메소드에서 @Transaction이 설정된 메소드를 호출할 경우 3. 메소드가 private일 경우 4. @Transactional을 선언한 함수 내부에 try-catch구문 크게 4가지를 찾아보고 대입해 보았지만 해당 문제와 무관하였다. 해..

Java/Spring 2022.04.09

Controller parameter 받는 방법

Controller은 비지니스 로직을 처리하고 데이터를 가공 하는 역할을 하는데, 이때 비지니스 로직을 처리하기위해 controller에서 데이터를 받는 방법 HttpServletRequest @RequestParam @RequestBody @ModelAtrribute @PathVariable localhost:8082/test?id=test localhost:8082/test?searchType=all&keyword=er 1. HttpServletRequest.getParameter() - 클라이언트의 요청정보를 확인하게해주는 HttpServletRequest를 이용하기 @GetMapping("/test"); public void getInfo(HttpServletRequest request){ log..

Java/Spring 2022.04.09

템플릿 레이아웃[2]

앞서 언급한 개념을 레이아웃 H1 레이아웃 컨텐츠 레이아웃 푸터 /resources/templates/template/layoutExtend/layoutExtendMain.html 메인 페이지 컨텐츠 메인 페이지 포함 내용 결과 레이아웃 H1 메인 페이지 컨텐츠 메인 페이지 포함 내용 레이아웃 푸터 layoutExtendMain에는 파라미터를 section으로 넘겼는데 layoutFile에서는 파라미터를 content로 받아서 사용 layoutFile.html 을 보면 기본 레이아웃을 가지고 있는데, 에 th:fragment 속성이 정의되어 있다. 이 레이아웃 파일을 기본으로 하고 여기에 필요한 내용을 전달해서 부분부분 변경하는 것으로 이해하면 된다. layoutExtendMain.html 는 현재 페이..

Java/Thymeleaf 2021.12.10

템플릿 레이아웃[1]

이전에는 일부 코드 조각을 가져와서 사용했다면 이번에는 더 확장해서 코드 조각을 레이아웃에 넘겨서 사용하는 방법 예를 들어 /resources/templates/template/layout/layoutMain.html 메인 컨텐츠 결과 메인 컨텐츠 common_header(~{::title},~{::link}) 이 부분이 핵심이다. ::title 은 현재 페이지의 title 태그들을 전달한다. -> layoutMain.html 의 title 태그들 ::link 는 현재 페이지의 link 태그들을 전달한다. -> layoutMain.html 의 link 태그들 결과 - 메인 타이틀이 전달한 부분으로 교체 - 공통 부분은 그대로 유지되고, 추가 부분에 전달한 들이 포함된 것을 확인 레이아웃 개념을 두고, 그..

Java/Thymeleaf 2021.12.10

템플릿 조각[0]

상단 영역이나 하단 영역, 좌측 카테고리 등등 여러 페이지에서 함께 사용하는 공통 영역을 관리 용이하게 처리 지원 package hello.thymeleaf.basic; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/template") public class TemplateController { @GetMapping("/fragment") public String template() { retu..

Java/Thymeleaf 2021.12.10

자바스크립트 인라인

자바스크립트에서 타임리프를 편리하게 사용할 수 있는 자바스크립트 인라인 기능을 제공 결과 //-----------------------자바스크립트 인라인 사용 전----------------------- //-----------------------자바스크립트 인라인 사용 후----------------------- 자바스크립트 인라인을 사용하지 않았을 경우의 문제점 1) 텍스트 렌더링 - var username = [[${user.username}]]; - 인라인 사용 전 -> var username= userA; - 인라인 사용 후 -> var username= "userA"; [인라인 사용 전] 타임리프 입장에서는 정확하게 렌더링 한 것이지만 아마 개발자가 기대한 것은 다음과 같은 "userA"라는..

Java/Thymeleaf 2021.12.10