안녕하세요 hibernate.core의 버전 변경과 관련되서 질문드립니다. 아래 코드와 같이 영한님이 말씀해주신 부분을 추가하고 plugins { id 'org.springframework.boot' version '2.6.5' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' ext["hibernate.versioin"] = "5.6.5.Final" configurations { compileOnly { extendsFrom annotationProcessor } } Gradle을 다시 로드했는데요 여전히 5.6.7 버전으로 구성되어 있습니다. 버전이 바뀌지 않는데 어떻게 해야하나요?
안녕하세요. 섹션8 진행하던 중 오류 해결에 도움이 필요해 글 남겨요.. Axios 인터셉터와 Access Token, Refresh 토큰 이용한 Access 토큰 자동 갱신 강의 내용의 코드를 강사님처럼 입력했는데 계속 오류가 납니다.. 콘솔 화면에 나타난 오류 찾아보니 TypeError: Cannot read properties of undefined (reading 'map') 오류가 serverData.dtoList 가 정의되지 않아서 발생했다고 하는데 어떻게 처리 해야 할지 모르겠어요. 참고로 강사님과 코드 내용이 같아 제 코드는 따로 첨부하지 않았어요. 필요하시면 첨부 하겠습니다.
안녕하세요 jpa 공부하다가 궁금한 것이 있어서 여쭤봅니다 채팅프로그램을 만들고 있는데 간단하게 user table id, email chattingroom id,user_id, room_number로 테이블이 구성되어있습니다 사용자가 로그인해서 채팅방번호를 입력하면 chattingroom만들어지는데 아무래도 id가 따로있다보니 chattingroom에 같은 user_id, room_number중복된 데이터가 생성됩니다 이같은 경우 생성전에 중복 쿼리를 생성해서 검증해야할지 oracle에 merge into ~ update ~ insert를 createQuery로만들어서 구현을 해야하는지 궁금해서 여쭤봅니다 감사합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 안녕하세요 강의를 보던 중 궁금한 것이 생겼습니다 ! 변경 감지를 할 때 Entity와 스냅샷을 비교하여 데이터가 변경되었는지 확인을 한다면 1차캐시에 em.persist로 넣어줘야 엔티티가 변경이 되지않을까? 라고 생각을 했습니다. 하지만 코드에는 em.persist를 주석처리하여 실행이 되지않게 막아놨음에도 변경 감지가 된다는 것은 제가 이해한 것 과는 다르게 persist를 해주지 않아도 set메서드를 사용하여 데이터를 바꿔준다면 1차 캐시의 엔티티가 변경이 되는건가요 ? => 변경 감지가 일어나려면? -> Entity가 변경이 되어야 한다 -> 그러면 persist로 변경된 Entity 값을 1차캐시에 넣어준다 -> 후에 스냅샷( 전 Entity 데이터 )와 변경된 Entity를 비교하여 다를 시 쿼리를 날린다 라고 이해를 하고 있는 상태입니다 ! [질문 내용] 여기에 질문 내용을 남겨주세요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. getter,setter이 적용이안됩니다. 1.enable 세팅해서 체크함 2.스프링 프로젝트만들대 디펜전씨에 롬복추가함 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> 3.플러그인 깔려있음 3가지 다 적용되어있는데 뭔 symbol?이런 에러뜨면서 롬복적용이안된데요
JPA 사용시 테스트 환경이 아닌, 일반 환경에서 update 쿼리문이 보이지 않는 이유가 궁금합니다. 제가 생각하는 update 쿼리문이 적용되는 과정은 transaction이 커밋이 되고, 더티 체킹을 통해서 기존 스냅샷과 비교해 달라진 값을 기준으로 쿼리문을 작성하고 flush()를 통해서 쿼리문을 DB에 날린다음에 flush()한 쿼리문에 대한 commit()을 통해 db에 최종적으로 저장되는 과정으로 이해하고 있는데, 결국 DB에 쿼리를 날리기때문에 로그를 확인했을때, 확인할 수 있어야 하는거 아닌지에 대해 궁금합니다. insert와 select 쿼리문은 로그가 올바르게 찍히는데 그에 반해 update 쿼리는 로그가 보이지 않습니다.
[질문 내용] JpaRepository 코드를 타고 들어가보니, 코드는 다음과 같았습니다. @NoRepositoryBean public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> { 분명 JpaRepository는 interface로 선언이 되어있는데, JpaRepository를 상속받은 제가 커스텀한 Repository는 구현을 따로 하지 않고 JpaRepository 인터페이스에 정의된 메서드들을 사용할 수 있는 건가요? 추상 클래스면 이해를 하겠지만 인터페이스에서 어떻게 사용이 가능한지 이해가 잘 되지 않습니다.
안녕하세요. 강의 자료중에, " MemberRepository는 JPA를 통해 회원을 저장하는데, 이때 JPA는 트랜잭션이 시작된 con1을 사용해서 회원을 저장한다 " 라고 되어있는데요. 이 부분에 대해 영한님께서 "em.persist()를 호출할때 내부적으로 JPA는 트랜잭션이 시작된 con1을 사용한다" 고 하셨는데, em.persist()를 호출할때, 실제 데이터베이스에 커밋은 아직 하지 않지만 con1을 사용해서 회원을 데이터베이스에 저장하는것인가요? "LogRepository도 트랜잭션C와 관련된 con2를 사용한다" 라고 강의자료에 나와있는 부분도, 위 내용과 동일한걸까요? con1과, con2를 사용한다는 개념이 어떤것을 의미하는지 궁금해서 질문드립니다. 감사합니다.
강의 설명에 따라 build.gradle에 implementation ' com.google .code.gson:gson:2.10.1' 입력 후 이 오류 때문에 강의를 더 이상 진행할 수가 없습니다. 오류로 인해 ./gradlew clean build --refresh-dependencies 터미널에도 실행해보고 configurations.all { resolutionStrategy { force ' com.google .code.gson:gson:2.10.1' } } 이 코드도 추가해서 해결해 보려 했으나, 오류가 해결되지 않았습니다. 도움 부탁드립니다.
섹션5에서 상품 이미지가 없는 상태로 add나 modify 를 하면 uplaod 폴더에 uuid 값만 있는 파일이 하나 생성됩니다. 혹시나 하고 CustomFileUtil 파일의 saveFiles 메서드에서 로그를 찍어봤는데 이미지 없이 넘겨도 files.size() 가 1이 나오던데 어떻게 해야 할까요? 강사님 자료 받아서 돌려도 같은 결과가 나옵니다.. 아래 이미지는 등록 시 이미지 없이 시도한 결과입니다.
안녕하세요. 강의 자료중에, " MemberRepository는 JPA를 통해 회원을 저장하는데, 이때 JPA는 트랜잭션이 시작된 con1을 사용해서 회원을 저장한다 " 라고 되어있는데요. 이 부분에 대해 영한님께서 "em.persist()를 호출할때 내부적으로 JPA는 트랜잭션이 시작된 con1을 사용한다" 고 하셨는데, em.persist()를 호출할때, 실제 데이터베이스에 커밋은 아직 하지 않지만 con1을 사용해서 회원을 데이터베이스에 저장하는것인가요? "LogRepository도 트랜잭션C와 관련된 con2를 사용한다" 라고 강의자료에 나와있는 부분도, 위 내용과 동일한걸까요? con1과, con2를 사용한다는 개념이 어떤것을 의미하는지 궁금해서 질문드립니다. 감사합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요 다름이 아니라 테스트 코드를 작성하여 결과를 확인하고 있었는데 교수님의 설명과 달리 Insert문이 계속해서 출력되고 있는 것이 의문이라 여쭤봅니다. 저는 rollback을 false로 하거나 em.flush를 따로 호출해주지 않았음에도 Insert문이 출력되는 이유가 궁금합니다. 참고로 저는 H2가 아니라 mysql 로컬 디비를 연결하여 개발 중인데 이 것이 사유가 되는걸까요? spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/testdb username: root password: /// jpa: hibernate: ddl-auto: update properties: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect format_sql: true logging: level: org.hibernate.SQL: DEBUG org.hibernate.type.descriptor.sql.BasicBinder: TRACE package jpabook.jpashop.service; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import static org.junit.Assert.*; @RunWith(SpringRunner.class) @SpringBootTest @Transactional public class MemberServiceTest { //테스트니까 이런식으로 해도 됨. @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { //~~걸 실행하면 ~~한 결과가 나와야 함, 검증해라 (given when then) //given Member member = new Member(); member.setName("kim"); //when Long savedId = memberService.join(member); //then assertEquals(member, memberRepository.findOne(savedId)); } @Test(expected = IllegalStateException.class) public void 중복_회원_예외() throws Exception { //given Member member1 = new Member(); member1.setName("kim1"); Member member2 = new Member(); member2.setName("kim1"); //when memberService.join(member1); memberService.join(member2); // try{ // memberService.join(member2); //예외가 발생 // }catch (IllegalStateException e){ // return; // } //then fail("예외가 발생하야 한다"); } }
안녕하세요? 아래 코드에서 em.clear() 를 호출하거나 호출하지 않거나 모두 SQL 로그가 나옵니다 . SQL 로그가 나온다는 것은 DB에 갔다올 것 같은 생각이 드는데요, 그렇지만 em.clear()를 호출하지 않는 경우에는 age 가 0으로 출력되고, em.clear()를 호출하는 경우 20으로 출력됩니다. SQL Queury가 로그에 찍히더라도 영속성 컨텍스트에서 값을 조회하는 경우가 있는걸까요? int resultCount = em.createQuery("update Member m set m.age = 20") .executeUpdate(); System.out.println("resultCount = " + resultCount); em.clear(); Member mm = em.createQuery("select m from Member m where m.name = :name", MemberJ.class) .setParameter("name", "회원1") .getSingleResult(); SQL 로그가 두 경우 모두 찍힘 Hibernate: /* select m from Member m where m.name = :name */ select m1_0.id, m1_0.age, m1_0.name, m1_0.TEAM_ID from MEMBER m1_0 where m1_0.name=?
강의를 따라가서 modify 버튼을 누르니 http://localhost:3000/todo/modify/[object%20Object]?page=1&size=10 이렇게 나오더라구요 그래서 섹션2 맨 마지막 강의를 찾아보니 modifyPage.js가 아래와 같았습니다. import React from 'react'; function ModifyPage(props) { return ( <div className={'text-3xl font-extrabold'}> Todo Modify Page </div> ); } export default ModifyPage; 2장 pdf의 동적페이지 이동: 수정/삭제 처리 후 이동 에는 import { useNavigate } from "react-router-dom"; const ModifyPage = ({tno}) => { const navigate = useNavigate() const moveToRead = () => { navigate({pathname:`/todo/read/${tno}`}) } const moveToList = () => { navigate({pathname:`/todo/list`}) } return ( ); <div className="text-3xl font-extrabold"> Todo Modify Page </div> } export default ModifyPage; 이렇게 나와있구요 어떻게 수정해야될까요? 참고로 위에 코드로 수정하면 export 어쩌구 하면서 오류가 나네요.. 참고로 리스트 버튼을 누르면 http://localhost:3000/todo/list?page=1&size=10 잘 넘어갑니다.. 추가 위에 두번째 코드처럼 ModifyPage.js를 수정해도 결과는 동일하게 http://localhost:3000/todo/modify/[object%20Object]?page=1&size=10 이렇게 나오네요.. 어떤 부분을 봐야할까요? 쳇지피티에 물어보니 백틱 문제라고 하는데 백틱도 적용했지만 해결이 안되네요.. 해결했습니다.. onClick={() => moveToModify(todo.tno)} 이 부분이 문제였던 것 같습니다. !!!!!!!!!!!!!!!!!!! pdf와 강의가 다른 부분에 대한 답변만 부탁드리겠습니다!
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] "@Repository가 붙은 클래스는 예외 변환 AOP의 적용 대상이 된다."는 내용에 대해 더 궁금한 점이 있습니다. 테스트 코드의 @Transactional를 주석 처리하고, @Import로 설정도 수정해서, JPA 대신 MyBatis나 JdbcTemplate을 적용해 봐도 log.info("repository = {}", itemRepository.getClass()); 테스트의 이 코드를 실행하면 itemRepository가 프록시로 생성된다는 것을 확인할 수 있었습니다. JPA가 아니라 해도 @Repository가 적용되면 프록시 객체로 생성되는 것 같습니다. 그런데 이전 스프링 핵심 원리 기본 편 강의에서 사용했던 core 프로젝트에서도 한번 테스트해 봤는데 //@Component @Repository public class MemoryMemberRepository implements MemberRepository { . . . } class OrderServiceImplTest { @Test void createOrder() { MemoryMemberRepository memberRepository = new MemoryMemberRepository(); System.out.println(memberRepository.getClass()); . . . } } 이 테스트를 실행해 보면 memoryMemberRepository는 @Repository가 적용되어 있음에도 불구하고 프록시 객체로 생성되지 않는 것 같습니다. 이 이유가 무엇인가요? @Repository를 통해 프록시 객체를 만드는 기능은 JPA 라이브러리가 있어야(JPA를 사용하지 않고 MyBatis를 사용하더라도) 적용되는 건가요? +) 그런데 스프링 DB 1편 강의에서 사용한 프로젝트에서도 테스트해 봤는데, 여기선 JPA 라이브러리를 받지 않았는데도 @Repository를 통해 프록시 객체가 생성되는 것 같습니다. 물론 @Transactional도 주석 처리했습니다. @Slf4j @Repository public class MemberRepositoryV5 implements MemberRepository { private final JdbcTemplate template; . . . } @Test void AopCheck() { log.info("memberService class = {}", memberService.getClass()); log.info("memberRepository class = {}", memberRepository.getClass()); Assertions.assertThat(AopUtils.isAopProxy(memberService)).isTrue(); Assertions.assertThat(AopUtils.isAopProxy(memberRepository)).isFalse(); } @Transactional을 주석 처리했으므로 memberService는 프록시 객체가 아니고, @Repository가 적용된 memberRepository는 CGLIB 관련 내용이 출력됩니다. @Repository를 통해 프록시 객체가 생성되려면 어떤 조건이 필요한지 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 영상을 4분대까지 본 후 혼자 테스트를 해보고 있던 중 질문이 있습니다. Member 클래스에서 JoinColumn을 통해 name을 LOCKER_ID로 설정해주셨는데 이 LOCKER_ID는 어떤 것을 의미하나요? Locker 테이블의 id값이 그럼 @Column(name = "LOCKER_ID") 이렇게 되어있어야 하는 것 이라고 이해를 하고있습니다. 두 번째 질문으로 Member 클래스에서 JoinColumn을 지우고 Locker 테이블에서도 따로 @Column(name ="LOCKER_ID")를 설정해주지 않고 JpaMain 클래스에서 Locker locker = new Locker(); locker.setName("lockerA"); em.persist(locker); Member member = new Member(); member.setUsername("member1"); member.setLocker(locker); em.persist(member); Team team = new Team(); team.setName("teamA"); team.getMembers().add(member); em.persist(team); tx.commit(); 이렇게 실행을 해보았는데 어째서 Member 테이블에 LOCKER_ID 라는 이름으로 컬럼이 생기고 값이 들어가는지 궁금합니다. -> Member 클래스에서 locker변수에 @JoinColumn도 해주지 않았습니다. Member, Locker 클래스는 이렇습니다 ! @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; @OneToOne private Locker locker; public Locker getLocker() { return locker; } public void setLocker(Locker locker) { this.locker = locker; } 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 Team getTeam() { return team; } public void setTeam(Team team) { this.team = team; team.getMembers().add(this); } } @Entity public class Locker { @Id @GeneratedValue private Long id; private String name; @OneToOne(mappedBy = "locker") private Member member; 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; } } 잘못 이해한 것이 있으면 설명 부탁드리겠습니다 ㅎㅎ