Springboot JPA + QueryDSL 계층형 댓글, 대댓글 구현(2) 이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이 전편에서 만들었던 N+1 문제가 발생하던 로직이다. 만약 부모 댓글의 개수가 100개라면 100번 이상의 쿼리가 나가게 되는 아주 좋지 못한 코드이다..ㅠ 🥲 위의 코드는 게시글... JavaJPASpringbootQuerydslJPA [MeU] Hashtag 기능 개발 ➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 검색 기능을 위해, 게시글이 삭제되면 tagPostMapping 테이블 안의 데이터도 함께 삭제된다. ✔️ vo/Tag.java, TagPostMapping.java ✔️ serv... MyBatisSpringbootSpringmysqlMyBatis ManyToOne, OneToOne 연관관계 조회 최적화 V1(Worst) Order -> Delivery를 OneToOne로 연관되어 있으며, Order -> Member는 ManyToOne으로 연관되어 있을때, Order를 통해 연관된 Delivery와 Member도 같이 DB로 부터 값을 가져와서 Response로 보내는 작업입니다. 엔티티를 그대로 가져오게되면, 무한 루프에 빠져서 끝없는 값을 반환받습니다. 그러한 이유는 모든 엔티티를 양방향에 지연 로딩(F... SpringbootJPAJPA ManyToOne, OneToOne 연관관계 조회 최적화 V2(Better)(DTO) Order -> Delivery를 OneToOne로 연관되어 있으며, Order -> Member는 ManyToOne으로 연관되어 있을때, Order를 통해 연관된 Delivery와 Member도 같이 DB로 부터 값을 가져와서 Response로 보내는 작업입니다. API DTO (Result라는 DTO에 OrderDTO를 한 번 감싸서 보내는 이유는, 해당 API에서는 조회 값이 배열로 반... SpringbootJPAJPA ManyToOne, OneToOne 연관관계 조회 최적화 V3&V4(Best) Order -> Delivery를 OneToOne로 연관되어 있으며, Order -> Member는 ManyToOne으로 연관되어 있을때, Order를 통해 연관된 Delivery와 Member도 같이 DB로 부터 값을 가져와서 Response로 보내는 작업입니다. Response를 보내는 것은 V2와 동일한 DTO로 반환하며, 반환 값도 같습니다. 하지만, findOrders를 가져올때 J... SpringbootJPAJPA OneToMany 연관관계 조회 & 컬렉션 조회 V3(V3_0, V3_1, V3_2) 하지만, JOIN FETCH로 orderItems도 가져올 경우, 문제가 발생합니다. Response 값을 보면 중복이 생기는 것을 확인 할 수 있습니다. JOIN FETCH로 ordeItems를 가져오는 것을 생각해면, 'SELECT *FROM orders o JOIN order_item oi ON o.order_id = oi.order_id;' 과 유사합니다. Distinct 덕분에 중복... JPASpringbootJPA [SpringBoot Error] Unsatisfied dependency expressed through constructor parameter 0 위와 같이 Bean 의존성 주입에 에러가 났다. 이는 entity에서 매개변수 값이 있을 때의 생성자만 생성했기 때문에 발생했던 오류였다. 비어있는 생성자를 생성해주면 해결된다... SpringbootSpringboot OneToMany 연관관계 조회 & 컬렉션 조회 V1 & V2 OneToMany 연관관계에서는 속성들이 컬렉션(List 등)이므로 이를 고려해서 연관관계 조회를 해야 합니다 V1, V2 모두 최적의 방법이 아니기 때문에, 두 방법을 사용하는 것을 추천하지 않습니다. 해당 포스팅은 이런한 방법이 있으며, 어떠한 문제점이 발생하며, 문제점들의 해결방안을 제시하기 위함 입니다. ManyToOne, OneToOne일때와 똑같은 문제 발생과 해결 방법도 비슷합니... SpringbootJPAJPA [SpringBoot] Custom Exception Response 만들기 API를 작성할 때 따로 Exception Handler를 만들어주지 않으면, Runtime Error시 모두 500 Error로 Response가 가게 된다. FE는 이 에러 코드에서 에러에 원인을 알 수 없다. 이를 해결하기 위해 Custome Exception을 추가하여 FE에게 내용을 전달하도록 해보자! 💡 다양한 상황에서 쓰일 Error Code를 만든다. 상태를 담을 HttpSta... Springboot개발일지Springboot JUnit 테스트 에러 : JPA metamodel must not be empty! JUnit 테스트코드 중 @WebMvcTest(특정클래스.class)를 붙인 Controller 클래스를 run할 때 생기는 오류이다. 이는 JPA에서도 @EnableJpaAuditing을 추가했는데 @WebMvcTest가 JPA 관련 Bean들을 로드하지 않기 때문에 에러가 발생한 것이다. 해결방법 둘 중 편한 방법을 선택하면 된다. 개인적으로는 테스트 추가할 때 마다 @MockBean을 ... SpringbootjunitJPAJPA [Cache]Springboot 환경에서 Redis 이용하기 안녕하세요 오늘은 캐시 서버 중 하나인 redis를 springboot와 연결해서 사용해보도록 하겠습니다 😀 Redis 서버 설치 redis를 사용하기 위해서는 일단 redis server를 설치해야 합니다 (spring boot는 redis client로 이용하는 것) 일단 가면 OS에 따라서 redis server을 다운받을 수 있고, 저는 docker을 이용해서 다운로드를 진행해보았습니... SpringbootredisdockerSpringboot 게시글 생성 + 파일 업로드(SpringBoot + JPA + AWS S3) 이번 글에서는 게시글 생성 + 파일 업로드(Aws S3)를 다룰 것이다. 먼저 게시글을 생성 하려면 제목, 내용, 카테고리 이름, 이미지파일을 프론트에서 넘겨받아야 한다. 이미지 파일은 List로 여러 개의 파일을 받을 것이다. 이미지 파일을 전송할 때는 FormData 방식으로 전달을 해야 하고, Json 타입의 제목, 내용, 카테고리 이름을 같이 보내기 때문에 @RequestPart를 사... S3awsSpringbootQuerydslJPAJPA [Springboot] nginx 무중단 배포 환경 설정 nginx 설치하는 방법은 에서 확인할 수 있다. WebRestController를 통해서 현재 어떤 profile을 사용 중인지 확인할 수 있다. prod-application.yml 설정 jar 배포 파일이 존재하는 곳(프로젝트 폴더 안의 build/libs에 있다)으로 이동해서 config 폴더를 만들어 주고 안에 yml 설정 파일을 만들어준다. 위의 명령어를 실행하면 prod-appl... NginxSpringbootNginx [Springboot] jar 파일 백그라운드 실행 종료 발단 nohup java -jar로 실행된 jar 파일은 백그라운드로 돌아가기 때문에 ctrl + c로 종료를 할 수가 없다. jar PID 번호 확인 명령어를 실행하면 위와 같이 jar와 관련된 프로세스와 그 정보가 뜬다. PID 번호를 확인해서 kill 시켜주면 된다. kill -9는 강제로 종료시킬 때 사용한다. 5305 프로세스가 종료된 것을 확인할 수 있다.... Springbootec2Springboot [SpringBoot JPA 활용 웹 애플리케이션 개발 : 수정(변경감지, Merge)] JPA에서 Transaction 안의 영속성 Entity의 데이터가 변경되면 변경을 감지해서 데이터를 update 함 Transaction commit 시점에 flush를 날리면서 데이터를 update 함 update를 따로 날릴 필요가 없음 [준영속 엔티티를 수정하는 두 가지 방법] 변경 감지 기능 사용 병합(merge) 사용 변경 감지 Service에서 Update 비즈니스 로직 메서드에... webJPASpringbootJPA [SpringBoot JPA 활용 웹 애플리케이션 개발 : 회원 가입 처리] 1. Spring Framework : validation Form Class 또는 DTO의 필드에 @NotEmpty(message = "xxx은/는 필수 입니다.") 로 필수입력 값 validation 체크를 할 수 있다. 2. Validation Check Form Class 또는 DTO로 Parameter를 받을 때 @Valid 하나로 유효성검사를 편리하게 할 수 있다. org.spri... webJPASpringbootJPA [Project] Kotlin + Spring Boot + Querydsl을 이용한 주소 검색 API 회사 서비스에서 외부 주소 API가 자주 삑난다고 주소 검색 내재화 API를 만든다는 말이 있었다. Server : Spring Boot, Spring Data Jpa, Querydsl 2. JPA Dialect를 이용한 match-against 기능 등록 순수 JPQL에는 match-against 기능을 지원하지 않는다. 이를 사용하기 위해 JPA의 Dialect를 알아야 한다. JPA는 ... projectSpringbootQuerydslQuerydsl [Springboot] aws(ec2)에 jar 파일 생성 후 실행 git clone을 통해 spring 프로젝트를 가져온다 그러고 gradlew가 있는 디렉토리로 이동해서 ./gradlew build 를 사용해 jar파일을 생성해준다. 하지만 처음에는 권한이 없다는 메시지가 나온다 gradlew에 권한을 주고 다시 build를 한다 빌드가 성공하면 ./build/libs로 이동한다 이렇게 스프링 application이 구동된다 nohup java -jar ... Springbootec2Springboot Dirty Checking vs. EntityManager.merge() (@RequestMapping, @GetMapping, @PostMapping 등 Spring MVC관련 내용은 이미 학습한 내용으로, 추가로 설명하지는 않겠습니다. 에서 Spring_MVC1 확인) 준영속 엔티티의 값을 변경할 때는 두가지 방법이 있습니다. 첫번째는 Dirty Checking(변화 감지)이고, 두번째는 EntityManager.merge()를 사용하는 것 입니다. 1.Dir... JPASpringbootJPA [Test] SpringBoot Test - Service (Mockito) 단위 테스트는 Service Layer의 비즈니스 로직만을 검증하는 것이므로, Repository와 Controller의 영향을 받지 않는 환경에서 테스트를 진행하여야 한다. 테스트의 F.I.R.S.T 원칙 F - Fast: 테스트를 시도하는 것에 있어서 주춤되지 않을 만큼 빨라야 한다. I - Independent: 객체의 상태, 메소드, 이전 테스트 상태, 다른 메소드의 결과에 의존해서는... Springboot넘바개발일지Springboot [SpringBoot JPA 활용 웹 애플리케이션 개발 : 주문 도메인 개발] 상품 주문 주문 내역 조회 주문 취소 주문 엔티티, 주문상품 엔티티 개발 주문 리포지토리 개발 주문 서비스 개발 주문 검색 기능 개발 주문 기능 테스트 취소 시 재고 삭제 주문 Entity는 생성될 때 주문이 들어온 것이기 때문에 주문 수량만큼 재고를 줄여줘야 함 > casecade Entity 관계 설정 중 cascade 를 설정해주면 주테이블에 데이터가 변경될 때 이하 테이블들도 같이 데... webJPASpringbootJPA Controller(+ @Valid) Controller: 웹 계층, Client의 요청을 받는 부분 MemberForm Client 쪽에서 회원가입하는 Member의 Form 데이터를 서버로 보낼때, 해당 데이터들을 MemberForm에 담아서 서버에서 처리합니다. @Valid를 통해 MemberForm를 validate 합니다. @Valid 애노테이션이 있으면, MemberForm에서 @NotEmpty,@NotBlank 등등... JPASpringbootJPA Boot - Slack Bot 연동하기 그룹이 슬랙과 연동할 경우, 그룹 원들의 상태가 Slack Bot을 통해 표시된다! 에서 Slack Bot 만들기 App Name과 workspace 선택 - AppName의 경우 추후 변경 가능 - workspace가 없으면 app 생성 불가! → 여러 workspace에서 사용하는 bot개발 시, 생성 후 distribution 설정 해야 함 생성 후 Bots 선택! Scope 적용 Re... Springboot두콩개발일지Springboot 회원가입 - User 모델 만들기 java에서 object를 만들면 object를 기반으로 테이블 생성 application.yml에서 ddl -> update => data를 insert하고 서버를 재실행 해도 data 유지 -> create => 서버를 재실행 하면 insert한 data 사라짐... 개인프로젝트SpringbootSpringboot Entity 생성 및 Repository 테스트 미리 작성된 ERD를 바탕으로 도메인 생성 @Entity: 테이블에 대응하는 하나의 클래스 기본 생성자 필수! → JPA가 엔티티 객체 생성 시 기본 생성자 사용 @Getter: Lombok라이브러리로 Getter 메소드 생성 Setter를 쓰지 않는 이유: 어떤 포인트에서든지 Setter 함수 호출을 통해 Entity의 값을 변경할 수 있다면, 변경한 의도를 파악하기 어려움 → 의도를 파악... SpringbootSpringboot Service, Controller 작성 요청에 따른 적절한 응답을 보냄 필드 주입(@Autowired) 대신 사용하는 생성자 주입! 순환 참조 방지 테스트 코드 작성 용이 객체 변이 방지 ( final 키워드 사용 ) 클라이언트가 전송하는 Json 형태의 HTTP Body 내용을 Java Object로 변환 메세지를 변환하는 과정에서 객체의 기본 생성자를 통해 객체를 생성하고, 내부적으로 Reflection을 사용해 값을 할당 →... Springboot개발일지Springboot Spring Boot 프로젝트 Nginx 무중단 배포 스크립트 단일의 aws ec2 인스턴스에서 무중단 배포를 해야 하는 상황이 드디어 온것이다. 시행착오를 거치면서 완성한 배포 스크립트를 공유한다. 프로젝트는 spring boot + gradle 기반의 프로젝트이고 nginx 서버를 사용하였다. 어플리케이션 사이드에서 포트 프로파일 정보와 헬스 체크에 관련한 컨트롤러를 생성하고 그 정보를 토대로 배포할때 참고한다. 현재 구동중인 프로파일 응답 컨트롤러... NginxSpringbootSpringNginx API Basics(Part 1: Request Response를 엔티티로 직접 사용) Postman을 이용해서 API를 테스트해볼 예정입니다. 앞서 Controller에서 request를 받아서 처리하는 작업을 했는데, API로 한번 더 하는 이유는? Controller에서는 HTML으로 Form 데이터를 받아서 회원가입 등을 하고 랜더링 할 페이지의 경로를 반환 했지만, API에서는 iOS, 안드로이드, Vue, React 등 별도의 프론트 클라이언트가 있으며, 클라이언트와... SpringbootJPAJPA API Basics(Part 2: Request Response를 DTO로 받음) V2: Request & Response로 DTO를 사용: Member 엔티티 대신에 CreateMemberRequest 등 DTO를 RequestBody, ResponseBody와 매핑한다. 장점: 1. 엔티티와 프레젠테이션 계층을 위한 로직을 분리할 수 있다. 2. 엔티티와 API 스펙을 명확하게 분리할 수 있다. 3. 엔티티가 변해도 API 스펙이 변하지 않는다. 4. 파라미터로 받는 ... SpringbootJPAJPA 이전 기사 보기
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2) 이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이 전편에서 만들었던 N+1 문제가 발생하던 로직이다. 만약 부모 댓글의 개수가 100개라면 100번 이상의 쿼리가 나가게 되는 아주 좋지 못한 코드이다..ㅠ 🥲 위의 코드는 게시글... JavaJPASpringbootQuerydslJPA [MeU] Hashtag 기능 개발 ➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 검색 기능을 위해, 게시글이 삭제되면 tagPostMapping 테이블 안의 데이터도 함께 삭제된다. ✔️ vo/Tag.java, TagPostMapping.java ✔️ serv... MyBatisSpringbootSpringmysqlMyBatis ManyToOne, OneToOne 연관관계 조회 최적화 V1(Worst) Order -> Delivery를 OneToOne로 연관되어 있으며, Order -> Member는 ManyToOne으로 연관되어 있을때, Order를 통해 연관된 Delivery와 Member도 같이 DB로 부터 값을 가져와서 Response로 보내는 작업입니다. 엔티티를 그대로 가져오게되면, 무한 루프에 빠져서 끝없는 값을 반환받습니다. 그러한 이유는 모든 엔티티를 양방향에 지연 로딩(F... SpringbootJPAJPA ManyToOne, OneToOne 연관관계 조회 최적화 V2(Better)(DTO) Order -> Delivery를 OneToOne로 연관되어 있으며, Order -> Member는 ManyToOne으로 연관되어 있을때, Order를 통해 연관된 Delivery와 Member도 같이 DB로 부터 값을 가져와서 Response로 보내는 작업입니다. API DTO (Result라는 DTO에 OrderDTO를 한 번 감싸서 보내는 이유는, 해당 API에서는 조회 값이 배열로 반... SpringbootJPAJPA ManyToOne, OneToOne 연관관계 조회 최적화 V3&V4(Best) Order -> Delivery를 OneToOne로 연관되어 있으며, Order -> Member는 ManyToOne으로 연관되어 있을때, Order를 통해 연관된 Delivery와 Member도 같이 DB로 부터 값을 가져와서 Response로 보내는 작업입니다. Response를 보내는 것은 V2와 동일한 DTO로 반환하며, 반환 값도 같습니다. 하지만, findOrders를 가져올때 J... SpringbootJPAJPA OneToMany 연관관계 조회 & 컬렉션 조회 V3(V3_0, V3_1, V3_2) 하지만, JOIN FETCH로 orderItems도 가져올 경우, 문제가 발생합니다. Response 값을 보면 중복이 생기는 것을 확인 할 수 있습니다. JOIN FETCH로 ordeItems를 가져오는 것을 생각해면, 'SELECT *FROM orders o JOIN order_item oi ON o.order_id = oi.order_id;' 과 유사합니다. Distinct 덕분에 중복... JPASpringbootJPA [SpringBoot Error] Unsatisfied dependency expressed through constructor parameter 0 위와 같이 Bean 의존성 주입에 에러가 났다. 이는 entity에서 매개변수 값이 있을 때의 생성자만 생성했기 때문에 발생했던 오류였다. 비어있는 생성자를 생성해주면 해결된다... SpringbootSpringboot OneToMany 연관관계 조회 & 컬렉션 조회 V1 & V2 OneToMany 연관관계에서는 속성들이 컬렉션(List 등)이므로 이를 고려해서 연관관계 조회를 해야 합니다 V1, V2 모두 최적의 방법이 아니기 때문에, 두 방법을 사용하는 것을 추천하지 않습니다. 해당 포스팅은 이런한 방법이 있으며, 어떠한 문제점이 발생하며, 문제점들의 해결방안을 제시하기 위함 입니다. ManyToOne, OneToOne일때와 똑같은 문제 발생과 해결 방법도 비슷합니... SpringbootJPAJPA [SpringBoot] Custom Exception Response 만들기 API를 작성할 때 따로 Exception Handler를 만들어주지 않으면, Runtime Error시 모두 500 Error로 Response가 가게 된다. FE는 이 에러 코드에서 에러에 원인을 알 수 없다. 이를 해결하기 위해 Custome Exception을 추가하여 FE에게 내용을 전달하도록 해보자! 💡 다양한 상황에서 쓰일 Error Code를 만든다. 상태를 담을 HttpSta... Springboot개발일지Springboot JUnit 테스트 에러 : JPA metamodel must not be empty! JUnit 테스트코드 중 @WebMvcTest(특정클래스.class)를 붙인 Controller 클래스를 run할 때 생기는 오류이다. 이는 JPA에서도 @EnableJpaAuditing을 추가했는데 @WebMvcTest가 JPA 관련 Bean들을 로드하지 않기 때문에 에러가 발생한 것이다. 해결방법 둘 중 편한 방법을 선택하면 된다. 개인적으로는 테스트 추가할 때 마다 @MockBean을 ... SpringbootjunitJPAJPA [Cache]Springboot 환경에서 Redis 이용하기 안녕하세요 오늘은 캐시 서버 중 하나인 redis를 springboot와 연결해서 사용해보도록 하겠습니다 😀 Redis 서버 설치 redis를 사용하기 위해서는 일단 redis server를 설치해야 합니다 (spring boot는 redis client로 이용하는 것) 일단 가면 OS에 따라서 redis server을 다운받을 수 있고, 저는 docker을 이용해서 다운로드를 진행해보았습니... SpringbootredisdockerSpringboot 게시글 생성 + 파일 업로드(SpringBoot + JPA + AWS S3) 이번 글에서는 게시글 생성 + 파일 업로드(Aws S3)를 다룰 것이다. 먼저 게시글을 생성 하려면 제목, 내용, 카테고리 이름, 이미지파일을 프론트에서 넘겨받아야 한다. 이미지 파일은 List로 여러 개의 파일을 받을 것이다. 이미지 파일을 전송할 때는 FormData 방식으로 전달을 해야 하고, Json 타입의 제목, 내용, 카테고리 이름을 같이 보내기 때문에 @RequestPart를 사... S3awsSpringbootQuerydslJPAJPA [Springboot] nginx 무중단 배포 환경 설정 nginx 설치하는 방법은 에서 확인할 수 있다. WebRestController를 통해서 현재 어떤 profile을 사용 중인지 확인할 수 있다. prod-application.yml 설정 jar 배포 파일이 존재하는 곳(프로젝트 폴더 안의 build/libs에 있다)으로 이동해서 config 폴더를 만들어 주고 안에 yml 설정 파일을 만들어준다. 위의 명령어를 실행하면 prod-appl... NginxSpringbootNginx [Springboot] jar 파일 백그라운드 실행 종료 발단 nohup java -jar로 실행된 jar 파일은 백그라운드로 돌아가기 때문에 ctrl + c로 종료를 할 수가 없다. jar PID 번호 확인 명령어를 실행하면 위와 같이 jar와 관련된 프로세스와 그 정보가 뜬다. PID 번호를 확인해서 kill 시켜주면 된다. kill -9는 강제로 종료시킬 때 사용한다. 5305 프로세스가 종료된 것을 확인할 수 있다.... Springbootec2Springboot [SpringBoot JPA 활용 웹 애플리케이션 개발 : 수정(변경감지, Merge)] JPA에서 Transaction 안의 영속성 Entity의 데이터가 변경되면 변경을 감지해서 데이터를 update 함 Transaction commit 시점에 flush를 날리면서 데이터를 update 함 update를 따로 날릴 필요가 없음 [준영속 엔티티를 수정하는 두 가지 방법] 변경 감지 기능 사용 병합(merge) 사용 변경 감지 Service에서 Update 비즈니스 로직 메서드에... webJPASpringbootJPA [SpringBoot JPA 활용 웹 애플리케이션 개발 : 회원 가입 처리] 1. Spring Framework : validation Form Class 또는 DTO의 필드에 @NotEmpty(message = "xxx은/는 필수 입니다.") 로 필수입력 값 validation 체크를 할 수 있다. 2. Validation Check Form Class 또는 DTO로 Parameter를 받을 때 @Valid 하나로 유효성검사를 편리하게 할 수 있다. org.spri... webJPASpringbootJPA [Project] Kotlin + Spring Boot + Querydsl을 이용한 주소 검색 API 회사 서비스에서 외부 주소 API가 자주 삑난다고 주소 검색 내재화 API를 만든다는 말이 있었다. Server : Spring Boot, Spring Data Jpa, Querydsl 2. JPA Dialect를 이용한 match-against 기능 등록 순수 JPQL에는 match-against 기능을 지원하지 않는다. 이를 사용하기 위해 JPA의 Dialect를 알아야 한다. JPA는 ... projectSpringbootQuerydslQuerydsl [Springboot] aws(ec2)에 jar 파일 생성 후 실행 git clone을 통해 spring 프로젝트를 가져온다 그러고 gradlew가 있는 디렉토리로 이동해서 ./gradlew build 를 사용해 jar파일을 생성해준다. 하지만 처음에는 권한이 없다는 메시지가 나온다 gradlew에 권한을 주고 다시 build를 한다 빌드가 성공하면 ./build/libs로 이동한다 이렇게 스프링 application이 구동된다 nohup java -jar ... Springbootec2Springboot Dirty Checking vs. EntityManager.merge() (@RequestMapping, @GetMapping, @PostMapping 등 Spring MVC관련 내용은 이미 학습한 내용으로, 추가로 설명하지는 않겠습니다. 에서 Spring_MVC1 확인) 준영속 엔티티의 값을 변경할 때는 두가지 방법이 있습니다. 첫번째는 Dirty Checking(변화 감지)이고, 두번째는 EntityManager.merge()를 사용하는 것 입니다. 1.Dir... JPASpringbootJPA [Test] SpringBoot Test - Service (Mockito) 단위 테스트는 Service Layer의 비즈니스 로직만을 검증하는 것이므로, Repository와 Controller의 영향을 받지 않는 환경에서 테스트를 진행하여야 한다. 테스트의 F.I.R.S.T 원칙 F - Fast: 테스트를 시도하는 것에 있어서 주춤되지 않을 만큼 빨라야 한다. I - Independent: 객체의 상태, 메소드, 이전 테스트 상태, 다른 메소드의 결과에 의존해서는... Springboot넘바개발일지Springboot [SpringBoot JPA 활용 웹 애플리케이션 개발 : 주문 도메인 개발] 상품 주문 주문 내역 조회 주문 취소 주문 엔티티, 주문상품 엔티티 개발 주문 리포지토리 개발 주문 서비스 개발 주문 검색 기능 개발 주문 기능 테스트 취소 시 재고 삭제 주문 Entity는 생성될 때 주문이 들어온 것이기 때문에 주문 수량만큼 재고를 줄여줘야 함 > casecade Entity 관계 설정 중 cascade 를 설정해주면 주테이블에 데이터가 변경될 때 이하 테이블들도 같이 데... webJPASpringbootJPA Controller(+ @Valid) Controller: 웹 계층, Client의 요청을 받는 부분 MemberForm Client 쪽에서 회원가입하는 Member의 Form 데이터를 서버로 보낼때, 해당 데이터들을 MemberForm에 담아서 서버에서 처리합니다. @Valid를 통해 MemberForm를 validate 합니다. @Valid 애노테이션이 있으면, MemberForm에서 @NotEmpty,@NotBlank 등등... JPASpringbootJPA Boot - Slack Bot 연동하기 그룹이 슬랙과 연동할 경우, 그룹 원들의 상태가 Slack Bot을 통해 표시된다! 에서 Slack Bot 만들기 App Name과 workspace 선택 - AppName의 경우 추후 변경 가능 - workspace가 없으면 app 생성 불가! → 여러 workspace에서 사용하는 bot개발 시, 생성 후 distribution 설정 해야 함 생성 후 Bots 선택! Scope 적용 Re... Springboot두콩개발일지Springboot 회원가입 - User 모델 만들기 java에서 object를 만들면 object를 기반으로 테이블 생성 application.yml에서 ddl -> update => data를 insert하고 서버를 재실행 해도 data 유지 -> create => 서버를 재실행 하면 insert한 data 사라짐... 개인프로젝트SpringbootSpringboot Entity 생성 및 Repository 테스트 미리 작성된 ERD를 바탕으로 도메인 생성 @Entity: 테이블에 대응하는 하나의 클래스 기본 생성자 필수! → JPA가 엔티티 객체 생성 시 기본 생성자 사용 @Getter: Lombok라이브러리로 Getter 메소드 생성 Setter를 쓰지 않는 이유: 어떤 포인트에서든지 Setter 함수 호출을 통해 Entity의 값을 변경할 수 있다면, 변경한 의도를 파악하기 어려움 → 의도를 파악... SpringbootSpringboot Service, Controller 작성 요청에 따른 적절한 응답을 보냄 필드 주입(@Autowired) 대신 사용하는 생성자 주입! 순환 참조 방지 테스트 코드 작성 용이 객체 변이 방지 ( final 키워드 사용 ) 클라이언트가 전송하는 Json 형태의 HTTP Body 내용을 Java Object로 변환 메세지를 변환하는 과정에서 객체의 기본 생성자를 통해 객체를 생성하고, 내부적으로 Reflection을 사용해 값을 할당 →... Springboot개발일지Springboot Spring Boot 프로젝트 Nginx 무중단 배포 스크립트 단일의 aws ec2 인스턴스에서 무중단 배포를 해야 하는 상황이 드디어 온것이다. 시행착오를 거치면서 완성한 배포 스크립트를 공유한다. 프로젝트는 spring boot + gradle 기반의 프로젝트이고 nginx 서버를 사용하였다. 어플리케이션 사이드에서 포트 프로파일 정보와 헬스 체크에 관련한 컨트롤러를 생성하고 그 정보를 토대로 배포할때 참고한다. 현재 구동중인 프로파일 응답 컨트롤러... NginxSpringbootSpringNginx API Basics(Part 1: Request Response를 엔티티로 직접 사용) Postman을 이용해서 API를 테스트해볼 예정입니다. 앞서 Controller에서 request를 받아서 처리하는 작업을 했는데, API로 한번 더 하는 이유는? Controller에서는 HTML으로 Form 데이터를 받아서 회원가입 등을 하고 랜더링 할 페이지의 경로를 반환 했지만, API에서는 iOS, 안드로이드, Vue, React 등 별도의 프론트 클라이언트가 있으며, 클라이언트와... SpringbootJPAJPA API Basics(Part 2: Request Response를 DTO로 받음) V2: Request & Response로 DTO를 사용: Member 엔티티 대신에 CreateMemberRequest 등 DTO를 RequestBody, ResponseBody와 매핑한다. 장점: 1. 엔티티와 프레젠테이션 계층을 위한 로직을 분리할 수 있다. 2. 엔티티와 API 스펙을 명확하게 분리할 수 있다. 3. 엔티티가 변해도 API 스펙이 변하지 않는다. 4. 파라미터로 받는 ... SpringbootJPAJPA 이전 기사 보기