묻고 답해요
148만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
정적 생성 메서드 파라미터에는 DTO or Parameters ?
package jpabook.jpashop.domain.item; import jakarta.persistence.DiscriminatorValue; import jakarta.persistence.Entity; import jpabook.jpashop.controller.BookForm; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import static lombok.AccessLevel.PROTECTED; @Entity @DiscriminatorValue("B") @Getter @Setter @NoArgsConstructor(access = PROTECTED) public class Book extends Item { private String author; private String isbn; // public static Book createBook(String author, String isbn, String name, int price, int stockQuantity) { // Book book = new Book(); // book.setName(name); // book.setPrice(price); // book.setStockQuantity(stockQuantity); // book.setAuthor(author); // book.setIsbn(isbn); // // return book; // } public static Book createBook(BookForm form) { Book book = new Book(); book.setName(form.getName()); book.setPrice(form.getPrice()); book.setStockQuantity(form.getStockQuantity()); book.setAuthor(form.getAuthor()); book.setIsbn(form.getIsbn()); return book; } }이렇게 정적 생성 메서드의 파라미터를 Dto형태로 두는 것과 파라미터를 전부 명시적으로 적는 것 중에서 어떤 코드가 더 나은 코드일까요?createBook을 호출해서 사용할 때도, 인자 값을 Dto 하나만 넣어주면 되고, 실제 스펙은 BookForm에서 간단하게 확인 가능하다고 판단했습니다..!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Entity, dto관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의를 들으며 정리하는 중에 모르는 점이 생겨 질문을 남기게 되었습니다.필드변수가 똑같음에도 book클래스가 아닌 bookForm클래스로 매개변수를 가진다-> view 레이어와 db 레이어 사이의 역할을 분리하기 위해서bookForm이라는 dto를 매개변수로 사용하고entity는 사용하지 않는다. entity 객체에서 @setter를 사용한다.-> builder패턴을 사용할 수 있지만 예제라서 단순화 했고 실제 코드를 짤 때는 setter를 지양하는 것이 좋다(직접적으로 변경될 수 있기 때문에) setter가 꼭 필요한 상황에서는 사용해도 된다.-> 솔직히 어떤 상황에서 인지 잘 이해가 가지 않습니다.데이터 값을 하나하나 바꾸는 게 흔한 상황..? 이라던지 예시를 들어주실 수 있을까요? 각 제가 생각한 답변 보충해주고 싶으신 거나 틀린 부분이 있다면 수정 부탁드립니다!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 편의 메서드 작성 방법에 대해 제가 이해한 것이 맞는지 피드백 부탁드립니다.
<Member 클래스>package jpabook.jpashop.domain; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") // 읽기 전용 private List<Order> orders = new ArrayList<>(); }<Order 클래스>package jpabook.jpashop.domain; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import java.time.LocalDateTime; import java.util.List; import static jakarta.persistence.FetchType.*; @Entity @Table(name = "ORDERS") @Getter @Setter public class Order { @Id @GeneratedValue @Column(name = "ORDER_ID") private Long id; @ManyToOne(fetch = LAZY) @JoinColumn(name = "MEBMER_ID") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems; @OneToOne(fetch = LAZY ,cascade = CascadeType.ALL) @JoinColumn(name = "DELIVERY_ID", unique = true) private Delivery delivery; private LocalDateTime orderDate; // 주문시간 @Enumerated(EnumType.STRING) private OrderStatus status; //todo: 연관관계 메서드(양방향) public void setMember(Member member) { this.member = member; // Order -> member member.getOrders().add(this); // member -> order } }Order쪽에서 멤버와의 관계는 @ManyToOne이라 수정, 삭제가 가능해서 연관관계 메서드를 작성할 필요가 없지만, Member 쪽은 mappedBy로 매핑되어있기 때문에 Order를 참조할 때 읽기만 가능하다고 들었습니다. 따라서 Member쪽에서도 Order를 수정, 삭제를 하려면 값을 설정해야 하기 때문에 연관관계 메서드를 작성해야만 양방향 참조가 가능하다고 이해하였습니다.정리하자면, 다 관계는 연관관계 메서드를 작성할 필요가 없고, 일 관계에서만 연관관계 메서드를 작성해야 양방향 참조가 가능한 것이 맞나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 편의 메서드 작성 방법에 대해서 제가 이해한 것이 맞는지 피드백 부탁드립니다.
package jpabook.jpashop.domain; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") // 읽기 전용 private List<Order> orders = new ArrayList<>(); }
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
31강 질문 있습니다.
책 대출기능 DB 테이블명을 'user_loan_hostory'라고 오타를 내서 생성을 하니까 책 대출 시 서버 내부 오류가 발생했습니다.그래서 테이블명을 'user_loan_history'로 수정한 후 대출 기능을 다시 실행해보니 잘 동작합니다. 왜 테이블명이 user_loan_hostory일 때는 인식하지 못하고, user_loan_history로 수정한 후에만 인식이 되는걸까요? db 테이블과 엔티티 객체를 매핑할 때, 대응되는 필드만 맞으면 DB 테이블명을 명시적으로 작성해주지 않아도 스프링이 알아서 인식하는 것이 아닌가요?ㅜㅜ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강의 마지막, 생성된 SQL문을 그대로 쓰면 안된다고 하신 말의 의미
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/)[질문 내용]강의 마지막에 JPA가 생성해준 SQL문들이 콘솔에 쫙 찍히잖아요. 영한님께서 이걸 그대로 복사해서 쓰면 안되고, 고치고 수정해서 사용해야 한다고 하셨는데요. JPA가 이미 자동으로 DB에 테이블을 생성해준 것 아닌가요? 왜 또 create 쿼리를 쓸 일이 있다는듯이 말씀하시는건지 이해가 안갔습니다.JPA 기본편을 점프하고 바로 넘어와서 이해가 안가는건진 모르겠지만, JPA기술 자체가 자동으로 DB를 생성하고 관리해주는 것에 의의가 있는 것 아닌가요? 쿼리문 생성용으로 쓰는거라면 그냥 시중에 erd 그리는 GUI 툴들이 많은데 그걸 쓰면 되는 것이 아닌지.. 질문드립니다.
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
JPA는 트랜잭션이 커밋이 될때 insert 쿼리를 날린다
예외와 트랜잭션 커밋, 롤백 - 활용 강의, 22:05 부분에서 이렇게 말씀해주셨는데요.강의에서는 runtimeException() 테스트를 실행해 런타임 예외 발생시 저장한 order 객체가 롤백이 되는것을 보여주셨습니다.직접 실행까지 했는데, 제가 궁금한것은 서비스 부분에 id 값을 찍어보았을때입니다. 서비스 코드 @Transactional public void order(Order order) throws NotEnoughMoneyException { log.info("order 호출"); System.out.println("order.getId() = " + order.getId()); orderRepository.save(order); System.out.println("order.getId() = " + order.getId()); 실행 결과order.getId() = null 2024-01-18T18:04:45.879+09:00 DEBUG 14780 --- [ Test worker] o.s.orm.jpa.JpaTransactionManager : Found thread-bound EntityManager [SessionImpl(1612240940<open>)] for JPA transaction 2024-01-18T18:04:45.879+09:00 DEBUG 14780 --- [ Test worker] o.s.orm.jpa.JpaTransactionManager : Participating in existing transaction 2024-01-18T18:04:45.879+09:00 TRACE 14780 --- [ Test worker] o.s.t.i.TransactionInterceptor : Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save] 2024-01-18T18:04:45.886+09:00 DEBUG 14780 --- [ Test worker] org.hibernate.SQL : select next value for orders_seq 2024-01-18T18:04:45.899+09:00 TRACE 14780 --- [ Test worker] o.s.t.i.TransactionInterceptor : Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save] order.getId() = 1실제 insert 쿼리를 실행해야 DB에서 생성되는 id 값이 들어있더군요.롤백이 되면 insert 쿼리를 DB에 안날린다고 하셨는데, insert 쿼리를 날려야 생기는 저 id 값은 정체가 무엇인가요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
SocketTimeoutException 이거는 어떻게 해결해야 하나요??
로컬에선 잘되는데 운영서버에 빌드할 때 이런에러가 자꾸 뜹니다
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
hibernate 설정 질문입니다.
<property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.use_sql_comments" value="true"/> <property name="hibernate.hbm2ddl.auto" value="create" />위와같이 설정하고 실행 시, 테이블이 이미존재한다면 drop 을 시키고 create를 하는데현재 외래키들 때문에 테이블을 무순서로 삭제할 수 없어 오류가 발생하는 상황입니다.그래서 그냥 테이블을 다 지우고 빌드하는데어떻게 강사님은 테이블을 안지우고 바로 빌드가 가능한가요?=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
test 클래스에서 persistence.xml인식문제
db2 커리큘럼에서 main과 test의 db를 분리하는 방법을 학습 후 이번 강의에서도 사용해보려고 했는데요다음과 같이 파일을 만든후 persistence.xml의 persistence.unit name을 다르게 지정해주고<property name="jakarta.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/testJpa2"/>이 부분도 main과는 다르게 설정해주고 실행하였는데 h2db에 연동이 안되는 것 같네요application.properties로 하였을땐 잘 되는데 저렇게 하니 안됩니다. persistence.xml파일 자체를 인식못하는것 같은데 제가하는 방법이 잘 맞는지 몰라 질문드립니다 참고로 초기세팅같은 경우 이전강의에서와 같이 start.spring.io에서 진행하였습니다. 저의 pom.xml은 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>jpa-basic</groupId> <artifactId>ex1-hello-jpa</artifactId> <version>0.0.1-SNAPSHOT</version> <name>ex1-hello-jpa</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> persistence.xml은 <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"> <persistence-unit name="hello-test"> <!--persistence unit이름을 다르게 설정--> <properties> <!-- 필수 속성 --> <property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/> <property name="jakarta.persistence.jdbc.user" value="sa"/> <property name="jakarta.persistence.jdbc.password" value=""/> <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/testJpa2"/> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <!-- Java transaction api를 jakarta에서 찾아라--> <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JakartaJtaPlatform"/> <!-- 옵션 --> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.use_sql_comments" value="true"/> <property name="hibernate.hbm2ddl.auto" value="create" /> </properties> </persistence-unit> </persistence>
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
유저서비스의 yml파일 관련 profile 설정방법이 궁금합니다.
안녕하세요 강의를 듣던중 profile이 어떻게 적용되는지 궁금하여 질문드리게 되었습니다. 현재 dev관련 설정파일이 왼쪽공통 항목 테스트를 위한 application.yml 파일이 오른쪽입니다.모두 같은 common이라는 환경변수로 어떤 .yml파일의 값을 사용하는지 확인하였는데요user-service의profile설정은 아래 사진처럼 하였습니다.health-check를 보내서 common값을 확인했을 때,아래사진 처럼 application.yml파일의 common값을 사용하는 것을 확인하였습니다. 공통으로 가져오는 application.yml파일의 common값과 ecommerce-dev.yml의 common값이 겹칠 때 profile을 dev라 설정했기 때문에health-check로 요청시common값에 common-dev 로 찍힐것이라 생각했었습니다. 혹시 common-dev로 안찍히는 이유가 공통으로 가져오는 application.yml값과 환경변수가 겹친다면 공통으로 가져오는 yml파일의 환경변수로 찍히는 것인지 제가 profile설정을 잘못한 것인지 궁금해 질문드렸습니다 ㅠㅠ
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
엔티티 매니저 공유
트랜잭션 전파가 REQUIRED인 경우에,코드적으로 각각 다른 트랜잭션을 가져와서 사용하더라도,persistence context를 공유해서 사용한다고 이해해도 될까요??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
왜 delete 쿼리가 안나가는 걸까요?
Parent class@Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent",cascade = CascadeType.ALL) private List<Child> childList = new ArrayList<>(); public void addChild(Child... childArray) { for (Child child : childArray) { child.setParent(this); childList.add(child); } }Child class@Setter @Id @GeneratedValue private Long id; private String name; @ManyToOne @JoinColumn(name = "PARENT_ID") private Parent parent;Main 메서드Parent parent = new Parent(); Child child = new Child(); Child child1 = new Child(); parent.addChild(child, child1); em.persist(parent); em.flush(); em.clear(); Parent findParent = em.find(Parent.class, parent.getId()); Child findChild = findParent.getChildList().get(0); em.remove(findChild); tx.commit();Main메서드에서 findParent에서 자식 리스트를 가져와 첫번째 자식을 삭제해도 db에는 여전히 child, child1이 남아있는데 혹시 왜 그런지 알 수 있을까요?
-
미해결실전! Querydsl
resultFetch 테스트 시 em.flush()를 주석했는데도 insert 쿼리가 발생하는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요.fetch 테스트 관련해서 제가 맞게 이해한 건지 확인차 질문 드립니다.resultFetch() 테스트를 해봤을 때, before()에서 flush를 주석하고 실행했는데도 insert쿼리가 발생했고, 그 insert 쿼리가 select 쿼리 직전에 실행되는 걸 확인했습니다. 이렇게 되는 이유가, em.persist로 인해 쓰기 지연 저장소에 들어있던 insert 쿼리가 JPQL에 의해 flush 된 거라고 생각이 되는데 맞게 이해한 걸까요? @SpringBootTest @Transactional @Commit class MemberTest { @PersistenceContext EntityManager em; JPAQueryFactory query; @BeforeEach void before() { query = new JPAQueryFactory(em); Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); Member member1 = new Member("1", 10, teamA); Member member2 = new Member("2", 20, teamA); Member member3 = new Member("3", 30, teamB); Member member4 = new Member("4", 40, teamB); em.persist(teamA); em.persist(teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); // em.flush(); // em.clear(); } @Test void resultFetch() { List<Member> fetch = query.selectFrom(member).fetch(); Member fetchOne = query.selectFrom(member).where(member.id.eq(1L)).fetchOne(); Member fetchFirst = query.selectFrom(member).fetchFirst(); Long totalCount = query.select(member.count()).from(member).fetchOne(); } }2024-01-17T23:34:46.349+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* insert for com.querydsl.entity.Team */insert into team (name, id) values (?, ?) 2024-01-17T23:34:46.355+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* insert for com.querydsl.entity.Team */insert into team (name, id) values (?, ?) 2024-01-17T23:34:46.356+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* insert for com.querydsl.entity.Member */insert into member (age, team_id, username, id) values (?, ?, ?, ?) 2024-01-17T23:34:46.357+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* insert for com.querydsl.entity.Member */insert into member (age, team_id, username, id) values (?, ?, ?, ?) 2024-01-17T23:34:46.358+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* insert for com.querydsl.entity.Member */insert into member (age, team_id, username, id) values (?, ?, ?, ?) 2024-01-17T23:34:46.360+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* insert for com.querydsl.entity.Member */insert into member (age, team_id, username, id) values (?, ?, ?, ?) 2024-01-17T23:34:46.402+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* select member1 from Member member1 */ select m1_0.id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 2024-01-17T23:34:46.473+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* select member1 from Member member1 where member1.id = ?1 */ select m1_0.id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 where m1_0.id=? 2024-01-17T23:34:46.477+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* select member1 from Member member1 */ select m1_0.id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 fetch first ? rows only 2024-01-17T23:34:46.512+09:00 DEBUG 23204 --- [ main] org.hibernate.SQL : /* select count(member1) from Member member1 */ select count(m1_0.id) from member m1_0
-
미해결Practical Testing: 실용적인 테스트 가이드
스프링 부트 3.x 질문
현재 스프링 부트가 3.x 이상만 지원하고 있는데자바 17 스프링 부트 3.x 최신버전으로 들어도 문제 없을까요??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
불변객체에 대하여 질문있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요. 우선 spring 부터 jpa 까지 수업 잘 듣고 있습니다! 명강의 항상 감사합니다. 임베디드 타입 공유 문제에 해결책으로 불변객체를 만들라는 말씀을 하셔서 궁금증이 생겼습니다. 제가 아는 바로는 불변의 의미가 상수의 개념과는 다르다고 알고 있습니다. "변수에 값을 바꿀 수 있냐"는 의미가 아니라 "처음 할당한 메모리 공간에서 값을 재 할당할 수 있느냐" 인걸로 알고 있습니다. 하여 , 아래와 같은 객체는 불변의 객체라고 볼 수 있느냐가 궁금합니다. 혹여라도 아래 객체가 불변 객체가 아니라고 한다면 컬럼이 수십 개인 실무에서는 어떻게 생성자 만으로 가독성 좋은 코드를 만드시는 지가 궁금합니다 ㅠ@GETTER@Embeddableclass Address { private String city; private String street; private String zipcode; Address() { } Address(String city, String street, String zipcode) { this.city = city; this.street = street; this.zipcode = zipcode; } // 세터 대신 Address changeCity(String city) { return new Address(city, this.street, this.zipcode) }} //사용member.setAddress(member.getAddress().changeCity("seoul"));
-
미해결실전! Querydsl
querydsl이 지원 중단되었다고 들었는데, 계속 사용할 메리트가 있을까요? 궁금해서 여쭤봅니다!
querydsl이 지원 중단되었다고 들었는데, 계속 사용할 메리트가 있을까요? 궁금해서 여쭤봅니다!
-
미해결생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
kakao token 발급 시 에러
안녕하세요 ! 강의 수강 중에 에러난 부분이 해결되지 않아 질문 남깁니다.지금 '카카오 토큰 발급 구현(2) - 토큰 받기' 강의 마지막까지 코드 작성 후 api 실행 했는데결과{"errorCode":"500 INTERNAL_SERVER_ERROR","errorMessage":"Could not extract response: no suitable HttpMessageConverter found for response type [class com.app.web.kakaotoken.dto.KakaoTokenDto$Response] and content type [text/html]"}로 나오고 있습니다.콘솔창의 에러는feign.codec.DecodeException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.app.web.kakaotoken.dto.KakaoTokenDto$Response] and content type [text/html] at feign.InvocationContext.proceed(InvocationContext.java:40) ~[feign-core-11.10.jar:na] at feign.AsyncResponseHandler.decode(AsyncResponseHandler.java:116) ~[feign-core-11.10.jar:na] at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:89) ~[feign-core-11.10.jar:na] at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:141) ~[feign-core-11.10.jar:na] at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:91) ~[feign-core-11.10.jar:na] at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100) ~[feign-core-11.10.jar:na] at com.sun.proxy.$Proxy109.requestKakaoToken(Unknown Source) ~[na:na] at com.app.web.kakaotoken.controller.KakaoTokenController.loginCallback(KakaoTokenController.java:39) ~[main/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.20.jar:5.3.20] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.20.jar:5.3.20] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) ~[spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.20.jar:5.3.20] at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) ~[tomcat-embed-core-9.0.63.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.20.jar:5.3.20] at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.63.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.63.jar:9.0.63] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.20.jar:5.3.20] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.20.jar:5.3.20] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.20.jar:5.3.20] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.20.jar:5.3.20] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.20.jar:5.3.20] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.20.jar:5.3.20] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]Caused by: org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.app.web.kakaotoken.dto.KakaoTokenDto$Response] and content type [text/html] at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:126) ~[spring-web-5.3.20.jar:5.3.20] at org.springframework.cloud.openfeign.support.SpringDecoder.decode(SpringDecoder.java:75) ~[spring-cloud-openfeign-core-3.1.8.jar:3.1.8] at org.springframework.cloud.openfeign.support.ResponseEntityDecoder.decode(ResponseEntityDecoder.java:61) ~[spring-cloud-openfeign-core-3.1.8.jar:3.1.8] at feign.optionals.OptionalDecoder.decode(OptionalDecoder.java:36) ~[feign-core-11.10.jar:na] at feign.InvocationContext.proceed(InvocationContext.java:36) ~[feign-core-11.10.jar:na] ... 57 common frames omitted 코드를 여러 번 봐도 강사님이랑 다른 부분이 없는 거 같아서 여쭤봅니다.감사합니다 !!
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
MyBatis 적용2에서 오류가 발생합니다.
MyBatis 버전도 낮춰보고 코드도 비교해보고 했는데 자꾸 Invalid bound statement오류가 발생합니다. 혹시 어떤 게 문제일까요.. 제가 잘 못 찾는 건가요..? 코드 : https://drive.google.com/file/d/14j1mBlyOWm9aELoBGtqbPQ6AAwla6DX5/view?usp=drive_link
-
미해결실전! Querydsl
프로젝션된 DTO의 필드 값으로 정렬이 가능할까요?
data class ShopSimpleResponse( val id: Long, val image: String, val name: String, val address: String, val introduce: String, val minPrice: Int, val checkCoupon: Boolean, ) { constructor(shop: Shop) : this( id = shop.id, image = shop.images[0].imgUrl, name = shop.name, address = shop.address, introduce = shop.introduce, minPrice = shop.products.minByOrNull { it.price }?.price ?: 0, checkCoupon = true ) }코틀린 코드인 점 죄송합니다!해당 DTO를 프로젝션해서 DB에서 바로 Page<ShopSimpleResponse> 로 반환하고 싶은데 아무리 찾아봐도 방법을 찾기 못했습니다....querydsl내에서나 @Query 를 사용해서 구현하는 방법이 있는지 궁금합니다.해당 부분을 엔티티의 필드 값으로 바꾸는 것도 고려하고 있는데, 우선 이 상태에서 해결 가능한 방법이 있는지 궁금합니다!