묻고 답해요
133만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
22: 10 초 질문입니다.
=======================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]22: 10 초에서는 Team과 Member의 join fetch 를 진행하면 result = 3 의 결과가 나오는데 저는 계속해서 result = 2의 결과가 나와서 질문드립니다. 최신 버전으로 인해서 jpa 최적화 방식의 변화가 생겨서 그런 것인지 아니면 제가 실수한 것인지 궁금합니다.JpaMain 실행결과: 디비 상태: package jpql; import jakarta.persistence.*; import java.util.List; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try{ Team teamA = new Team(); teamA.setName("teamA"); em.persist(teamA); Team teamB = new Team(); teamB.setName("teamB"); em.persist(teamB); Member member1 = new Member(); member1.setUsername("회원1"); member1.setAge(10); member1.setTeam(teamA); em.persist(member1); Member member2 = new Member(); member2.setUsername("회원2"); member2.setAge(10); member2.setTeam(teamA); em.persist(member2); Member member3 = new Member(); member3.setUsername("회원3"); member3.setAge(10); member3.setTeam(teamB); em.persist(member3); em.flush(); em.clear(); String query = "select t from Team t join fetch t.members"; List<Team> result = em.createQuery(query, Team.class) .getResultList(); System.out.println("result = " + result.size()); for (Team team : result) { System.out.println("team = " + team.getName()); for(Member member : team.getMembers()){ System.out.println("-> member = " + member.getUsername()); } } tx.commit(); } catch(Exception e){ e.printStackTrace(); tx.rollback(); } } } package jpql; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.OneToMany; import java.util.ArrayList; import java.util.List; @Entity public class Team { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>(); public List<Member> getMembers() { return members; } public void setMembers(List<Member> members) { this.members = members; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } package jpql; import jakarta.persistence.*; @Entity public class Member { @Id @GeneratedValue private Long id; private String username; private int age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; @Enumerated(EnumType.STRING) private MemberType type; public MemberType getType() { return type; } public void setType(MemberType type) { this.type = type; } public void changeTeam(Team team) { this.team = team; team.getMembers().add(this); } public Team getTeam() { return team; } public void setTeam(Team team) { this.team = team; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Member{" + "id=" + id + ", username='" + username + '\'' + ", age=" + age + '}'; } }
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OrderSimpleQueryDtos 생성 시 AllArgsContructor 사용
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 강의를 들으면서 5분 쯤에 new jpabook 을 통해 쿼리의 select 결과물을 선택하는 코드 부분에 강사님께서 OrderSimpleQueryDtos 의 생성자를 만드실 때 궁금한 점이 있습니다. 생성자를 만들 경우 @AllArgsConstructor 를 사용해서하는 것과 강사님께서 직접 하나씩 주입해주시는 것의 차이가 있을까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 주문에서 insert가 안되고 select 됩니다
회원 가입, 상품 등록에는 데이터 베이스 insert가 사용하나상품 주문 에서는 insert가 아닌 select만 사용 됩니다.2h 페스워드는 jpashop 입니다https://drive.google.com/file/d/1aCGyaNxhGlpeWDy0EIkNp5wBgV4WVLaA/view?usp=sharing
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
도커 질문이 있습니다.,
강의자료와 똑같이 진행했는데 도커의 포트폴리오를 실행하면 1초뒤에 바로 종료됩니다. 원인이 뭘까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
UsernamePasswordAuthenticatioToken
안녕하세요, 문의 사항이 있어 글 납깁니다...당장에 이해가 안되어서요,,,,UserDetailService . loadUserByUsername()은 password활용 없이 ID만을 통해 find하게 짜도 문제 없나요,,? 어디선가 password를 따로 비교해주나요???....?어떤 컬럼인지 어떻게 알고 비교해주지,,,ㅁ 질문드립니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
cascade, 연관관계 사용 기준 질문.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 강의 잘 듣고 있습니다.cascade,연관 관계를 사용하는 기준이 궁금해서 질문 글을 작성합니다.1.cascade 질문제가 이해한 바로는 엔티티를 영속성 컨텍스트 관리를 받기 위해 persist 등록하는 것이며 각 엔티티는 따로따로 persist를 해야 되는데 cascade를 사용하면 하나의 엔티티를 persist할 때 그와 연관된 엔티티를 같이 해주는 것으로 이해했습니다. Order 코드에서 OrderItem과 Delivery에 cascade가 적용됐는데 Member에는 적용을 안 하는 것 같더라고요. 왜 Member는 안 하는지 궁금합니다. 연관 관계 질문order와 연관된 엔티티 간에 연관관계 메소드를 통해 한쪽에서 서로 등록해주는 것은 이해가 가는데 Item과 Category간에는 어느 쪽에도 연관 관계 메소드가 없는 이유가 궁금합니다. Item과 Category 이 둘은 약간 상수? 느낌이라서 연관 관계를 지을 필요가 없는 것일까요? 답변 주시면 정말 감사하겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Category, Item 연관관계
이전 강의를 통해 연관관계의 주인이 아닌 클래스에 mappedBy 속성을 사용한다고 이해하였습니다. Category 에 @JoinTable 을 사용하고, Item 에 mappedBy 속성을 사용하셨는데 왜 Item 에 mappedBy 를 사용하신 것인지 궁금해서 질문 남깁니다. 감사합니다.
-
해결됨Practical Testing: 실용적인 테스트 가이드
@RequestParam vs @ModelAttribute
강의에 나온 내용은 아니지만 개인적으로 개발을하다 궁금한 점이 생겨서 질문 드립니다.조회 API를 만들 때 (GET요청)Controller단에서 파라미터를 받는 방식이 @RequestParam, @ModelAttribute 크게 2가지 있는데 2가지 방식중 어떤 방식을 선호하지는지 질문드립니다. @RequestParm을 사용했을 때는 Controller단에서 바로 직관적으로 어떤 파라미터를 받는지 확인이 가능하다는 장점이 있지만 Service단으로 파라미터를 넘겨줄 때, 하나하나 넘겨줘야해서 파라미터가 추가되었을 때 불편하다는 점이 있을 테고@ModelAttribute를 사용했을 때는 수정에는 유리하겠지만 가독성은 떨어질 것 같다는 생각이 듭니다.강사님은 어떤 생각을 가지고 계신지, 현업에서는 주로 어떤방식으로 개발을 하는지 의견주시면 감사하겠습니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
테스트코드에서 스프링빈 자동 등록시 트랜잭션
안녕하세요!제가 기억이 안 나는지 갑자기 궁금해진 부분이 있습니다. aop class=class hello.springtx.apply.TxBasicTest$BasicService$$SpringCGLIB$$0강의대로 하니 정상적으로 Proxy 적용 확인할 수 있었습니다 그런데 갑자기 왜 테스트에서 수동으로 스프링 빈 등록을 했었지...? 라는 생각이 들어서 @SpringBootTest(classes = TxBasicTest.BasicService.class) public class TxBasicTest {@TestConfiguration을 주석처리 후 자동으로 빈을 생성할 클래스(BasicService)를 지정했습니다: aop class=class hello.springtx.apply.TxBasicTest$BasicService Expecting value to be true but was false Expected :true Actual :false다시 실행해보니 프록시가 적용이 안되어있습니다 왜 프록시가 스프링 컨테이너에 등록되지 않은건지 궁금합니다!@SpringBootTest로 해도 테스트코드에서 @Component 적용이 안되는건지 궁금합니다
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
34강 orphanRemoval 관련 질문입니다!
orphanRemoval 을 걸지 않았을 경우책6을 삭제했으나, userLoanHistories를조회해보면 여전히 책6이 존재한다.orphanRemoval = true 을 걸었을 경우클린 코드를 삭제했더니조회시 사라졌다어째서 orphanRemoval을 걸어주지 않으면데이터베이스에 반영이 되지 않는건가요? @Transactional어노테이션으로 인해 트랜잭션이 시작될 때,영속성 컨텍스트가 시작되고,영속성 컨텍스트의 4대 특징 중 하나인생성/수정 감지로 인해user 객체의 userLoanHistories 의 값에변경사항(removeOneHistory)이 발생하여자동저장이 될거라고 생각했는데 말이죠.. 실제 데이터베이스상에선 userLoanHistories 는user테이블의 필드가 아니기 때문에,영속성 컨텍스트가 관리하는 field 에 포함이 되지않는데orphanRemoval = true 를 걸어주면비로소 자신이 관리하는 field로 인식하는걸까요?원리가 너무 궁금해요.. 내용추가1)바로 다음 강의인 책 대출 리팩토링에선orphanRemoval 같은 옵션을 주지 않고도new userLoanHistory를 add한 내용대로 저장이 되는데,어째서 userLoanHistory를 remove하는것은orphanRemoval 옵션이 없으면데이터의 변경이 일어나지않는지 궁금합니다.. 제 생각에는 User에서 userLoanHistories.add를 하든 userLoanHistories.remove 를 하든둘 다 User와 UserLoanHistory 와의 연관관계를 이용한데이터를 변경하기위한 접근같은데 ..add는 되는데 remove는 안되는게 살짝 이해하기 어렵습니다 ㅠ 내용추가2)returnBook과 loanBook , removeOneHistory의 차이점이 뭘까 고민해봤는데returnBook 과 loanBook 은UserLoanHistory라는 Entity에 접근하는 과정(loanBook은 Entity객체생성, returnBook은 Entity의 property 수정)이 존재하고, removeOneHistory는 Entity에 직접 접근하는게 아니라 단순히 List에 대한 변경일뿐이고, Entity에 대한 직접적인수정이나 생성이 이뤄진것이 아니므로 데이터베이스의 변경이 일어나지 않았다.이렇게 이해했는데 제가 이해한 내용이 맞을까요?생각을 정리하다보니 질문이 길어진 점 죄송합니다 ㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
H2 2.2.224버전 MVCC
저는 현재 스프링 부트 최신 버전 3.2.2 를 쓰고H2는 2.2.224 버전을 사용하고 있습니다.테스트를 할 때 실패가 떠서 확인해보니org.h2.jdbc.JdbcSQLNonTransientConnectionException: Unsupported connection setting "MVCC" [90113-224] 위와 같은 오류가 생겼습니다.H2 데이터베이스의 MVCC 옵션은 1.4.200 버전부터 deprecated 되었고, 이후 버전에서는 완전히 제거되었다고 합니다.url: jdbc:h2:tcp://localhost/~/jpashop저와 같은 오류가 생기시는 분이 있으시다면 이렇게 MVCC 부분을 제거하고 실행하시면 테스트가 잘 돌아갑니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
CascadeType.ALL 질문
엄청난 질문은 아니짐만 궁금한점이 있어 질문드립니다. CascadeType.ALL을 사용하면 자동으로 연관된 엔티티나 자식 엔티티들의 영속성을 관리해주는것으로 이해했는데 그렇게되면 fetch = EAGER을 사용할때와같은 데이터베이스 과부하 문제가 발생하지는 않는지 질문드립니다.실무에선 CascadeType.ALL을 잘 사용하는지 경우를 나누어서 사용한다면, 언제는 부적절하고 언제는 사용하는 것이 적절한지 궁금합니다. 사용하지 않는다면 대안은 무엇인지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
application.yml을 꼭 main/resources/application.yml 경로에 넣자
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]application.yml파일을 main/resources/application.yml에 넣었다고 생각했는데 폴더 바깥에 두어서 한동안 뭔지도 모르고 헤맸습니다.. 혹시 저와 똑같이 헤매시는 분이 있을까 해서 글 남깁니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
버전 3.2.2 테스트 오류 - 해결은 했지만 궁금한 점
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] id 'java' id 'org.springframework.boot' version '3.2.2' id 'io.spring.dependency-management' version '1.1.4'java { sourceCompatibility = '17'}현재 쓰는 버전입니다.애플리케이션 실행에는 문제가 없지만 테스트시에 아래와 같이 오류가 뜹니다.Execution failed for task ':test'.> There were failing tests. See the report at: file:///C:/Workspace/jpa_%EA%B0%95%EC%9D%98/jpashop/build/reports/tests/test/index.html* Try:> Run with --scan to get full insights.Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.For more on this, please refer to https://docs.gradle.org/8.5/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.BUILD FAILED in 1s4 actionable tasks: 1 executed, 3 up-to-date이에 대한 해결 방법을 찾아 보던 중파일 - 설정 - 빌드,실행,배포 - gradle - 다음을 사용하여 테스트 실행 - IntelliJ IDEA 로 변경을 하여 해결하였습니다.해결은 했지만 왜 이와같은 오류가 일어났었는지 IntelliJ IDEA 로 테스트를 실행하도록 했을 때 왜 동작하는지 앞으로 다른 문제가 발생하지는 않을지 궁금합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
내장 톰캣에 대해 궁금한게 있습니다.
스프링부트에부터는 내장 톰캣을 사용하는거엔 익숙해져 있는데,과거에는 RedHat JBoss와 같은 외장 WAS들을 사용했다고 하던데 이로 인해 발생하는 단점 같은 것은 없을까요? 예를 들어 기술 지원을 더이상 받지 못한다던가.. 외장 WAS들이 가지고 있는 장점이 사라진다거나 성능의 차이같은 것은 없는지 궁금합니다. 검색을 해보았을 땐 내장 톰캣이 아파치 톰캣 개발자들도 내장 톰캣의 사용에 문제가 없다라고 했다던지, 성능 차이가 크지 않다는 자료들은 찾았는데 아직 여전히 스프링부트를 사용하지 않는 회사들이 많다고 알고 있습니다. 강의 내용처럼 이렇게 편리하다면 스프링부트의 버전업은 몰라도 스프링'만' 쓰는 회사들이 시스템을 스프링부트로 업그레이드 하지 않을 이유는 없을 것 같아서요! 친절한 강의 감사드립니다. 태현님!
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
@Slf4j 위치
문제가 있거나 하는건 아니고 궁금해서 여쭤봅니다! @Slf4j @SpringBootTest public class TxBasicTest {TxBasicTest 클래스에 @Slf4j를 작성 후, @Slf4j static class BasicService { ... }Service에서도 다시 @Slf4j를 작성하신 이유가 있을까요?Service에 @Slf4j가 없어도 Service안의 log는 정상적으로 출력되는 걸로 보이는데다른 이유가 있는지 궁급합니다!!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
itemId 파라미터
주문하고 제출하면 이렇게 뜨는데 itemId 파라미터가 제대로 연결이 안된거인가요?? 코드 똑같이 작성했는데 뭘 제대로 다시 봐야하는지 잘 모르겠어요...
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
2depth의 @OneToOne, @ManyToOne N+1문제
Shop, Business, User라는 세 엔티티에 연관관계가 각각 맺어져 있습니다.Shop - Business(연관관계 주인은 Business, OneToOne관계)Business - User(연관관계 주인은 Business, ManyToOne-OneToMany 관계)여기서, 모든 관계는 Lazy로딩으로 설정되어 있고, shop의 business는 null로 존재하는 상황입니다.문제의 상황은 크게 두가지인데요.Shop을 조회할 때 Business Lazy로딩으로 설정되었지만, Business에 대한 조회 쿼리가 발생위 상황에서 Business가 조회되고, 거기에 ManyToOne으로 연관된 User도 조회 쿼리 추가로 발생그래서 1개의 조회를 했는데, 2개가 추가로 나옵니다. 사실 첫 번째 문제는 찾아보니 null값을 Proxy객체가 담을 수 없어서 조회쿼리가 발생하는 것이라고 들었습니다. 그런데 두 번째 쿼리(User의 조회 쿼리)는 왜 발생하는지 도저히 모르겠네요..ㅠ 아래는 Shop, Business, User의 코드입니다. 코틀린으로 작성된 점 양해부탁드립니다.@Entity class Shop( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "shop_id") var id: Long = 0L, ... @OneToOne(mappedBy = "shop", cascade = [CascadeType.ALL], orphanRemoval = true) var business: Business? = null, )@Entity class Business ( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "business_id") var id: Long = 0L, ... @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "shop_id") var shop: Shop, @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") val seller: User )@Entity class User( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "user_id") var id: Long = 0L, ... @OneToMany(mappedBy = "seller", cascade = [CascadeType.PERSIST], orphanRemoval = true) val businessList: MutableList<Business> = mutableListOf(), )
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
수정이라는 작업을 할 때 PUT을 더 사용하는 이유가 있을까요?
HTTP 메서드에 처음 공부할 때 수정의 경우에는 PUT과 PATCH를 사용한다고 배웠는데요. PUT의 경우에는 통째로 갈아끼우는 방식의 갱신이고PATCH의 경우에는 부분 수정이 가능하다고 배웠습니다.이 강의에서는 USER의 정보중에 이름만받고 있어서(PUT은 전체 필드를 명시해주어야 한다고 배웠습니다.) PATCH가 더 적당한 방식이 아닌가라는 생각이 들었습니다. PATCH가 아닌 PUTMapping을 사용하신 이유가 있으실까요? 그리고 이와 관련된 블로그 글들이 많은데 저마다 내리는 결론이 달라서 조금 혼란스럽습니다. 강사님의 생각을 듣고 싶습니다.좋은 강의 만들어주신 태현님을 존중하고 존경하며 이만 글 줄이겠습니다!
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
26강 삭제 기능관련 질문입니다..!!
UpdateUser 사용시deleteUser 사용시2024-02-10 21:46:30.786 ERROR 10012 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.IncorrectResultSizeDataAccessException: query did not return a unique result: 2; nested exception is javax.persistence.NonUniqueResultException: query did not return a unique result: 2] with root cause오류코드를 보니 updateUser는 findById의 결과값이 고유하므로 문제가 일어나지않는데, deleteUser는 findByName으로 유저를 찾기때문에 같은 이름이 존재하면 결과값이 고유하지않으므로 오류가 발생하는거 같은데, (엄준식이 2명존재) 처음부터 Id 값을 받아오거나 생성시에 같은 이름을 못만들게 막는거 말고는해결할 방법이 없을까요?