스프링 14

Spring Data JPA를 활용한 Update 처리(변경감지, 더티체킹)

최근 Spring Data JPA를 사용하며 SSR 방식으로 개발중이다. 게시글 정보를 수정하는 Update 로직을 처리 하려고 한다 JPA에서 Update 처리 로직을 보기 전에 변경감지(더티체킹)이 뭔지 알아보자 더티체킹이란? Transaction안에서 엔티티의 변경이 일어나면 변경내용을 자동으로 데이터베이스에 반영하는 JPA 특징이다. 게시글을 관리하는 BoardService의 updateBoard 메서드이다. 우리가 생각하는 JPA를 활용한 쿼리 처리는 JPARepository를 상속받고 있는 boardReporitory 인터페이스에서 JPA에서 제공해주는 기본 메서드인 findAll(), deleteById() 등 이런 메서드를 사용하여 update도 똑같이 처리를 할거라고 생각하겠지만, 소스를..

Spring-Boot 2024.04.13

PRG 패턴 : Post → Redirect → Get

PRG 패턴이란? 웹 개발 패턴 중 자주 사용되는 패턴으로 HTTP POST 요청에 대한 응답이 GET 요청을 위한 URI로 리다이렉트되는 것이다. 현재 문제점 상품 등록 버튼을 누르면 POST로 /add를 호출한다. 그 후 결과물이 POST로 남아있다. 마지막으로 요청한 것은 POST/add이다. 그 결과 새로고침을 하면 마지막 요청이 반복되므로 id만 증가하고 중복된 상품이 계속 등록된다. 웹 브라우저의 새로고침은 마지막에 서버에 전송한 데이터를 다시 전송하기 때문이다. 등록완료 페이지에서 새로고침을 누르게되면 이런식으로 중복된 데이터가 계속 쌓이게 된다. 이것을 해결할 수 있는 방법이 PRG 패턴을 적용시키는 것이다. PRG 패턴 적용 후 흐름 상품 등록 버튼을 누르면 POST /add가 호출된다...

Spring-Boot 2024.01.26

[Spring] 롬복(lombok)이란?

Lombok은 여러가지 @어노테이션을 제공하고 컴파일 과정에서 자동으로 개발자가 원하는 메소드를 생성/주입 방식으로 동작하는 라이브러리이다. 말로 설명하기보단 코드로 한번 보는게 이해가 빠를것이다. 롬복을 적용하기 전과 후를 보면 확실한 차이가 있다. 대충 자바를 좀 공부해봤던 사람들은 저 어노테이션만보고도 "아 이런 기능을 제공하는거구나" 라고 알 것이다. @Getter: getXxx()들을 자동으로 만들어주는 것이다. @Setter: setXxx()들을 자동으로 만들어주는 것이다. @NoArgsConstructor: 기본 생성자를 자동으로 생성해 준다. 눈에는 안보이지만 과연 실제로 만들어져있는지 확인해보자 Member() - 기본생성자, getXxx() - 게터, setXxx() - 세터가 다 만들..

Spring 2024.01.08

인텔리제이 로그 출력 안되는 문제 해결

실행 과정 중 로그를 확인 해야 하는 경우가 있는데 스프링 부트 3.1.x 이상부터는 변경사항이 생긴것 같다. 스프링 부트 3.1 미만 버전 19:18:00.439 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@7cdbc5d3 19:18:00.445 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance o..

Spring 2024.01.06

[Spring] 싱글톤 패턴이란

김영한 스프링 강의를 듣던 중 싱글톤패턴의 개념이 나왔다. 싱글톤 패턴이란 객체(인스턴스)가 현재 JVM 안에 단 하나만 존재해야한다라는 것이다. 싱글톤패턴이 왜 생겼는가? 스프링의 탄생부터 알아보자 스프링은 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다. 대부분의 스프링 애플리케이션은 웹 애플리케이션이고, 물론 웹이 아닌 애플리케이션도 얼마든지 개발할 수 있다. 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 그림을 통해 예를 들어보자 우리가 만들어둔 AppConfig(DI 컨테이너)가 있다고 가정하자. 클라이언트 A,B,C가 스프링한테 memberService를 요청하면, DI 컨테이너 안에서 요청 건수마다 new를 통해 객체를 생성해서 반환하게 된다. 웹 애플리케이션 특성 상 고객이 ..

Spring 2024.01.05

[Spring] BeanFactory, ApplicationContext의 개념, 차이점

BeanFactory 스프링 컨테이너의 최상위 인터페이스 스프링 빈을 관리하고 조회하는 역할 getBean()을 제공한다 지금까지 내가 사용했던 대부분의 기능들은 BeanFactory가 제공하는 기능이다 ApplicationContext BeanFactory 기능을 모두 상속받아서 제공 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해주는데 그러면 둘의 차이가 뭘까? 애플리케이션을 개발할 때는 빈은 관리하고 조회하는 기능을 물론이고, 수 많은 부가기능이 필요하다 ApplicationContext I/F을 보면 많은 것들을 상속받고 있는데 상속받는 Factory를 따라가다보면 이렇게 최상위 인터페이스는 BeanFactory인 것을 볼 수가 있다. ApplicationContext가 제공하는 부가..

Spring 2024.01.05

[Spring] IoC, DI, 컨테이너의 개념

김영한 선생님의 스프링강의를 보면서 드디어 스프링 개념이 나오기 시작해서 정리해보려고 한다. 제어의 역전 IoC(Inversion of Control) 기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 구현 객체를 생성하고, 연결하고, 실행했다. 한마디로 구현 객체가 프로그램의 제어 흐름은 스스로 조종했다. 개발자 입장에서는 자연스러운 흐름이다. AppConfig가 등장한 이후에는 구현 객체는 자신의 로직을 실행하는 역할만 담당한다. 프로그램의 제어 흐름은 이제 AppConfig가 가져간다. 프로그램에 대한 제어 흐름에 대한 권한은 모두 AppConfig가 갖고 있다. 이렇듯 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)이라 한다. 프레임워크 vs 라이..

Spring 2024.01.03

[Java] 객체지향적 설계의 의존 관계(DIP, OCP, DI)

김영한의 스프링 강의를 보면서 클론 코딩을 해보던 중에 할인 정책을 변경하기 위해 "OrderServiceImpl"클래스의 코드를 수정하였다. 강의를 듣는 중에 이렇게 하면 될것이다? 라는 생각으로 구현을 했는데 강의 도중 이 부분은 객체지향적 설계의 DIP 위반을 했다는 점이다. 역할(interface)와 구현체(impl)을 충실하게 분리 했다. -> OK! 다형성 활용, 인터페이스, 구현 객체를 분리 했다. -> OK! OCP, DIP 같은 객체 지향적 설계원칙을 준수했다. -> 그렇게 느꼈지만, 사실은 아니다. 왜 문제일까? DIP: 주문서비스 클라이언트(OrderServiceImpl)은 'DiscountPolicy' 인터페이스에 의존하여 DIP 원칙을 지킨것 같은데? 클래스 의존 관계를 분석해보았..

Java 2024.01.02

[Git] 초기 프로젝트 생성 시 Git Push 오류

김영한의 스프링 강의를 들으며 프로젝트 생성을 하고 버전관리, 기록 관리를 위해 해당 프로젝트를 Git 연동하고 Push를 하던 중 오류가 나타났다 이러한 에러가 나타났다 찾아보니 github repository를 생성할 때 readme.md를 생성했기 때문에 발생하는 오류라고 한다. 레파지토리에는 있는 readme 파일이 원격에는 존재하지 않아서 나타나는 오류 같지만 사실은 더 정확히 말하면 readme.md 파일의 존재가 문제가 되는 것이 아니고, 원격 저장소에서 readme.md를 추가하는 커밋이 로컬 저장소의 커밋 로그에는 없기 때문이라고 한다. (push 명령은 로컬 저장소의 commit 목록과 원격 저장소의 commit 목록을 비교한다.) 원격 저장소와 로컬 저장소의 상태가 달라서 push가 ..

Git 2023.12.29

메이븐(maven) vs 그래들(gradle) 비교

인텔리제이로 스프링 부트 프로젝트를 생성하는 도중 Type 부분을 보면 gradle과 maven이 있는걸 확인했다 둘다 빌드 관리 도구인건 알았으나 어떤 차이점이 있는지 몰라 확실하게 알아보고자 한다 1. 메이븐(maven) 아파치 메이븐은 자바용 프로젝트 관리 도구이다 아파치 Ant의 대안으로 만들어짐 프로젝트를 진행하면서 수많은 라이브러리를 관리 해주는 도구이다 여기서 메이븐의 특징은 그 라이브러리들과 연관된 라이브러리들까지 거미줄처럼 모두 연동이 되어 관리가 가능해진다는 점이다 POM - project object model Maven의 기능을 이용하기위해서는 POM을 사용한다 POM은 약자 이름 그대로 project object model의 정보를 담고 있는 파일이다 pom.xml에서 주요하게 다..

Spring-Boot 2023.12.20