묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
실전 예제 1 - 요구사항 분석과 기본 매핑 질문있습니다.
1.7분에서 setter 보다 유지보수 때문에 생성자를 쓰는데 이유 좀 자세하게 알수 있나요?2.9분 53초에서 뒤에 사용될 명령어 나오게 하는 단축키 뭔가요?3.10분 45초에 @Table(name="Orders")//Orders로 한 이유가 에약어로 order은 orderby로 인식된다.(db마다 다름) 가 맞나요?4.14분 10초처럼 아래 문구를 어떻게public void setStockQuantity(int stockQuantity) {this.stockQuantity = stockQuantity;}public void setStockQuantity(int stockQuantity) {this.stockQuantity = stockQuantity;} 이렇게 바꾸나요? 5. 왼쪽화면은 제화면이고 오른쪽 화면은 강의 화면입니다. 빨간색 네모박스처럼 상위 폴더 하위 폴더가 안나뉘어집니다. 이렇게 어떻게 해야 하나요? 시도한 방법:jpabook.jpashop.domain1 을 domain1 이렇게 리팩터 시도를 하면 활성화가 안됩니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
실전 예제 1 - 요구사항 분석과 기본 매핑 강의 세팅 질문있습니다.
jpamain 실행시 아래같이 db에는 잘 붙는거 확인했는데요.h2창은 잘뜹니다.근데 강의 18분<아래 그림 참조>정도에 나오는것처럼 db가 안뜹니다.<jpa 실행문구> memberpackage jpabook.jpashop.domain1; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Member { @Id @GeneratedValue @Column(name="MEMBER ID") private Long id; private String name; private String city; private String street; private String zipcode; 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; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getZipcode() { return zipcode; } public void setZipcode(String zipcode) { this.zipcode = zipcode; } } 파일링크 jpamainimport javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; 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 { tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); } emf.close(); } }
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
JPQL은 FROM절 없이 실행할 수 없다는게 맞는거죠?
QueryDSL을 공부를 하다가 JPQL은 FROM절 없이 사용할 수 없다는 말을 들었습니다.그래서 그렇구나 이해를 하기보다 정말 그런가 하고 찾아보려고 했는데공식문서를 어디를 참조해야할지 모르겠더라구요오라클 JPA 2.0에서 JPQL 설명이 있는데 그 부분을 참조하면https://docs.oracle.com/javaee/6/tutorial/doc/bnbuf.html#bnbujFROM 절은 식별 변수를 선언함으로써 쿼리의 도메인을 정의합니다.라고 적혀있더라구요 SQL과 다르게 JPQL은 도메인을 기준으로 쿼리를 실행하기 때문에 FROM절을 생략할 수 없다고 이해하면 될까요 ?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
JdbcTemplateItemRepository2 적용 후 로그
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]JdbcTemplateItemRepositoryV2 적용 후 아래 화면처럼 로그가 뜬다고 설명해주셨는데제 PC 에서 실행 후 로그는 아래 화면 처럼 뜹니다.이에 관해 몇가지 질문이 있습니다. 1.로그가 서로 다른 이유가 무엇인가요??본인 PC 로그 표시 레벨은 기본 레벨인 Info로 되어있었기 때문2.어떻게 하면 강의 화면 처럼 로그가 띄울 수 있나요??application.properties 파일에 logging.level.org.springframework.jdbc=DEBUG 속성 추가(스프링 버전은 강사님이 첨부해주신 프로젝트를 가지고 사용한것이라 강의에서 사용된 프로젝트의 스프링 버전과 동일할 것으로 생각됩니다.)두 가지 질문 답변 부탁드립니다.감사합니다. 강의를 보다보니 답을 찾았습니다..... 세션 앞부분 강의에서 방법을 적어주셨었네요....제가 앞부분 강의를 제대로 집중해서 듣지 못했나봅니다.....
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
DB 테이블간 연결에 대한 질문입니다.
안녕하세요 태현님. 두가지 질문이 있습니다.1. 지금까지(34강) 강의를 따라 하고 MySQL 워크벤치에서 ERD를 확인해 보면테이블 간에 PK - FK로 연결이 안 되어있는데요연결을 안 해주어도 괜찮은 이유가 뭔지 궁금합니다.제가 NestJS나 Express.js 로 백엔드를 만들었을 때는 TypeORM, Prisma, Sequelize 같은 ORM을 이용했었는데그때는 코드단에서 테이블 간에 연결 처리 (PK - FK로 연결)을 해주면데이터베이스에서 확인을 해봤을 때이런 식으로 연결이 된 것을 확인할 수 있었거든요..혹시 제가 뭔가 잘못 알고 있는 걸까요?굳이 DB에서 실제로 연결을 안 해주어도 괜찮은 건가요??아니면 스프링 + JPA 조합의 특성인가요??2. 그리고 MySQL 워크벤치에서create table user_loan_history ( id bigint auto_increment, user_id bigint, book_name varchar(255), is_return tinyint(1), primary key (id) );이렇게 DB create 문을 작성해서 실행 시키지 않아도 서버를 실행시킬 때 자동으로 로컬 DB에 테이블을 생성해 주도록 하는 설정이 있는지 궁금합니다.
-
해결됨Practical Testing: 실용적인 테스트 가이드
긴 작업일 경우 트랜잭션을 걸지 말아도 된다는 점이 이해가 잘 안갑니다.
안녕하세요. 테스트 코드를 수강하고 있는 학생입니다. 긴 작업일 경우 트랜잭션을 걸지 말라고 하셨는데. 조회용 트랜잭션이 Repository 단에서 걸린다는 말씀을 하셨는데 Repository의 조회 로직이 수행될 때 트랜잭션이 걸리는 건가요? 뭔가 잘못 이해한거 같기도 해서 질문합니다. 그리고 @RequiredArgsConstructor @Service public class MailService { private final MailSendClient mailSendClient; private final MailSendHistoryRepository mailSendHistoryRepository; public boolean sendMail(String fromEmail, String toEmail, String subject, String content) { boolean result = mailSendClient.sendEmail(fromEmail, toEmail, subject, content); if (result) { mailSendHistoryRepository.save(MailSendHistory.builder() .fromEmail(fromEmail) .toEmail(toEmail) .subject(subject) .content(content) .build() ); return true; } return false; } } 여기서는 Transaction을 걸어줘야 하는게 맞는거 같아서.이 부분도 궁금합니다. 요약저는 서비스 Layer에서 Transaction을 걸어 db작업에서 문제가 발생했을 경우 rollback 되어야 한다고 생각했습니다.강의에서 긴 작업들이 실제로 트랜잭션에 참여하지 않아도 되는데 -> OrderStatisticsService에서는 CUD작업이 아니니깐 Transaction을 안 걸어도 된다.?MailService에서는 Transaction을 걸어줘야 하는게 아닌가요? (Create 작업 수행)조회용 트랜잭션이 Repository 단에서 걸린다.? 뭔지 잘 모르겠습니다.
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
에러 발생 코드 관련 질문입니다.
//BookService @Service public class BookService { private final BookRepository bookRepository; private final UserLoanHistoryRepository userLoanHistoryRepository; private final UserRepository userRepository; public BookService( BookRepository bookRepository, UserLoanHistoryRepository userLoanHistoryRepository, UserRepository userRepository ) { this.bookRepository = bookRepository; this.userLoanHistoryRepository = userLoanHistoryRepository; this.userRepository = userRepository; } @Transactional public void saveBook(BookCreateRequest request) { bookRepository.save(new Book(request.getName())); } @Transactional public void loanBook(BookLoanRequest request) { // 1. 책 정보를 가져온다. Book book = bookRepository.findByName(request.getBookName()) .orElseThrow(IllegalArgumentException::new); // 2. 대출기록 정보를 확인해서 대출중인지 확인한다. // 3. 만약에 확인해는데 대출 중이라면 예외를 발생시킨다. if (userLoanHistoryRepository.existsByBookNameAndIsReturn(book.getName(), false)) { throw new IllegalArgumentException("이미 대출되어 있는 책입니다"); } // 4. 유저 정보를 가져온다. User user = userRepository.findByName(request.getUserName()) .orElseThrow(IllegalArgumentException::new); // 5. 유저 정보와 책 정보를 기반으로 UserLoanHistory를 저장 userLoanHistoryRepository.save(new UserLoanHistory(user.getId(), book.getName())); } } 북서비스 코드인데요// 1. 책 정보를 가져온다. Book book = bookRepository.findByName(request.getBookName()) .orElseThrow(IllegalArgumentException::new);이 부분에서 // 2. 대출기록 정보를 확인해서 대출중인지 확인한다. // 3. 만약에 확인해는데 대출 중이라면 예외를 발생시킨다. if (userLoanHistoryRepository.existsByBookNameAndIsReturn(book.getName(), false)) { throw new IllegalArgumentException("이미 대출되어 있는 책입니다"); } 이 부분 처럼 "존재하지 않는 책입니다" 라는 메세지를 터미널(콘솔인가요? 이거 찍히는 곳 명칭이 터미널인지 콘솔인지 모르겠네요) 에 찍어주려면 어떻게 해야하나요? 그리고 첫 번째 경우와 두 번째 경우에 에러를 발생시키는 방법이 다른 이유는 무엇인지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티와 테이블 맵핑 네이밍 규칙 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의를 보면 엔티티 클래스에서는 pk 필드를 그냥 id 로 선언하고, 테이블에서는 테이블명_id로 설계하십니다.서로 같은 네이밍을 쓰지 않는 이유가 궁금합니다. 다른 비슷한 질문의 경우 아래와 같이 답변 주셨는데, 엔티티의 PK 필드는 ID로 네이밍 하는다는 규칙을 정한것 뿐이지 큰의미는 없다고 봐도 되는걸까요? order 엔티티도 order_id로 하는게 좋지 않나요? 그렇게 하지 않으신 이유가 order에 이미 memberId 필드가 있어서 그런걸까요? 굳이 order_id라고 명명하지 않아도 memberId와 구분되서 그런건가요? ID 컬럼 혹은 id 필드의 명명 규칙은 강의에서 통일성 있게 위에 정리한 기준에 맞게 작성한 것으로 보시면 될 것 같습니다.(orderId로 하여도 문제 없습니다. 자바에서 변수명은 카멜케이스가 관례입니다.)
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Component를 InitDb에서 전역으로 해준 것 아닌가요?
@Component를 InitDb에서 전역으로 해준 것 아닌가요?다시 InitService에서 다시 @component를 해주는 이유가뭔지 궁금합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
글동록하는부분에서 등록을 하고나면 나이부분에 값이 00세라고들어가네요 이유가뭘까요??
객채셍성하고 등록화면부분올려드렷어요
-
미해결코드로 배우는 React with 스프링부트 API서버
로그인 적용확인 회차에대해서
위에 내용하고 겹치는듯한데 맞나요?... 로그인 적용확인 회차부터해서 뭔가 내용이 이어지질 않는듯한 느낌이듭니다....
-
해결됨실전! Querydsl
강사님 Pageable->OrderSpecifier 변환 질문이 있습니다.
강의는 스프링 데이터 페이징 활용 3 - 컨트롤러 개발시간은 6:33코드는for (Sort.Order o : pageable.getSort()) { PathBuilder pathBuilder = new PathBuilder(member.getType(), member.getMetadata()); query.orderBy(new OrderSpecifier(o.isAscending() ? Order.ASC : Order.DESC,pathBuilder.get(o.getProperty()))); List<MemberTeamDto> content = query.fetch(); }루트 엔티티가 현재는 member 입니다. 직접 테스트해보고 싶어서 임의의 엔티티 user를 만들고 left join으로 묶었습니다@Override public Page<MemberTeamDto> searchPageComplex(MemberSearchCondition condition, Pageable pageable) { JPAQuery<MemberTeamDto> query = factory .select(new QMemberTeamDto( member.id, member.username, member.age, team.id, team.name, user.name)) .from(member) .leftJoin(member.team, team) .leftJoin(user).on(team.id.eq(user.id)) .where(usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe())) .offset(pageable.getOffset()) .limit(pageable.getPageSize()); JPAQuery<Long> countQuery = factory .select(member.count()) .from(member) .leftJoin(member.team, team) .where(usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe())); for (Sort.Order order : pageable.getSort()) { PathBuilder pathBuilder; if (order.getProperty().equals("name")) { pathBuilder = new PathBuilder<>(user.getType(), user.getMetadata()); } else { pathBuilder = new PathBuilder<>(member.getType(), member.getMetadata()); } query.orderBy(new OrderSpecifier(order.isAscending()? Order.ASC:Order.DESC,pathBuilder.get(order.getProperty()))); } List<MemberTeamDto> content = query.fetch(); return PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne); }left join user를 추가하고 조건은 user.id = team.id 로 했습니다.http://localhost:8080/v2/members?page=0&size=3&sort=name,asc&sort=username,asc실행되는 SQL은select m1_0.member_id, m1_0.username, m1_0.age, m1_0.team_id, t1_0.name, u1_0.name from member m1_0 left join team t1_0 on t1_0.team_id=m1_0.team_id left join users u1_0 on m1_0.team_id=u1_0.id order by u1_0.name, m1_0.username limit 0,3;단순한 경우에는 상관이 없지만 조인하는 경우에는 동작을 잘 안한다고 설명을 해주셔서 간단하게 테스트를 해봤는데 동작을 하더라구요 강의 이후에 오류가 수정되어 해결이 된건지 아니면 제가 테스트를 잘못한걸까요?아니면 강사님께서 말씀하신 경우가 이 경우가 아닌 걸까요 ?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
섹션 4엔티티 매핑 질문입니다.
1. 객체와 테이블 매핑 5분 29초에서@entity역할이 member라는 클래스라는 설계도를 기준으로 그림처럼 meber1entity,meber2entity,meber3entity 이런식으로 나타내게 하는 역할인가요?기본 키 매핑 34분에서 아래그림 빨간색 박스처럼 em.persist(member52)하면 db sql=51 ||52 이렇게 되니까 에러나는거 아닌가요? 50이 아니라 기본 값을 그러면 10000을 줘야 하는거 아니에요? 37분에서는 1번쨰는 1부터 51까지 주고 2번째는 51부터 100까지 준다는데 이게 무슨 뜻인지 이해가 어려워서요..
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
준영속 상태 질문입니다.
1. 위사진에서 분홍색 박스 부분 select가 왜나오는거에요? find를 실행하면 나온느건가요?
-
미해결Practical Testing: 실용적인 테스트 가이드
mockMVC CRUD작업
controller테스트를 할때 mockMVC를 사용하면 DB에 CRUD 작업은 수행되지 않나요?디버깅을 해보면 각 Layer별로 동작이 수행되는거 같은데 DB접근하여 데이터를 가져오는 부분에서는 null이 계속 나오네요(MyBatis 사용중).또 만약 실제 프로덕션 controller처럼 모든 동작이 수행된다면 왜 "하위 Layer를 모두 mocking처리" 라고 표현하시는지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 2 강 질문있습니다.
1. 7분 1초 그림과 7분 9초 그림이랑 차이가 뭔가요? 혹시 7분 1초 그림에서 3번이 7분 9초 그림인건가요?2. 13분에 내부적으로 리프랙션을 하기때문에 동적으로 생성자를 생성해야 한다고 하셨는데요.리프랙션은 뭐고 동적은 무슨의미인가요? 움직임을 뜻하는건 아닌것 같아서요3. 23분에 1번에는 flush() 이렇게 되어있고 4번에는 flush 이렇게 되어있는데 혹시 flush 가 2번 실행되는건가요?첫째코드가 강의 Hello JPA - 애플리케이션 개발28분에 나온 코드이고 2번째코드가 영속성 컨텍스트 2 24분에서 나온코드입니다.List<Member> result=em.createQuery("select m from Member as m",Member.class).getResultList(); //Member 객체를 m으로 별칭하고 객체 m을 선택해라 for (Member member:result){// 각 Member 엔터티에 대해 반복합니다. System.out.println("member name = " + member.getName()); }Member member=em.find(Mmeber.class,150L);를 List<Member> member=em.find(Mmeber.class,150L); 이렇게 바꿔도 되나요? 4.영속성 컨텍스트 2 7분 그림에서요. 그림에서 flash는 3번과정인가요? 아니면 3번과정 직전인 동기화 상태인가요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
V2에서 별도의 DTO를 사용하는 이유가 궁금합니다.
안녕하세요 강사님!Entity를 바로사용 하지 않는 이유는보안에 취약여러 곳에서 사용하기 때문에 entity가 바뀌면 곤란함이 두가지 때문이라고 이해했는데.V2의 경우에는 별도의 DTO를 구성해서 이를 해결한다고 말씀을 해주셨습니다. 하지만 사용 쓰임새가 다 다르면 별도의 DTO를 계속해서 고쳐줘야 하는건 V1과 마찬가지 아닌가요? 보안 문제만 해결할 수 있는 것처럼 보이는데 원리를 이해하지 못하겠습니다.
-
해결됨실전! Querydsl
querydsl Projection 성능 문제
안녕하세요 Querydsl Projection 을 활용해 DTO에 담는경우 성능 관련 질문이 있습니다. Querydsl에서 Projections.constructor를 활용해서 query를 작성하는경우 fetchJoin이 되지 않더라구요.일대 다 관계에서 fetchJoin을 하지 않게되면 n+1 이슈가 발생할거 같은데Projections을 활용하는 환경에서 성능개선은 어떻게 해야할까요?
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
로드 밸런싱 관련 질문
안녕하세요! 강사님 로드 밸런싱 & 서버 관련 질문드립니다.Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)현재 저는 섹션 2 API Gateway Service 까지 강의를 진행한 상태입니다. 현업에서는 해당 강의에서 나와있는 것처럼 어플리케이션 단에서의 로드 밸런싱 구현을 많이 하나요?아니라면 현업에서는 어떠한 방법으로 자주 사용하여 구현을 하나요? 어떤 상황에서 어플리케이션 단에서의 로드 밸런싱 구현을 하나요?트래픽 분산을 목적으로 로드 밸런싱을 사용하기 위해 여러 개의 어플리케이션 인스턴스들을 서버에 올린다고 하였을 때 현업에서는 어떻게 관리하나요? AWS EC2 기준으로 설명해주시면 좋을 것 같습니다! 읽어주셔서 감사합니다(__)
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Hello JPA - 프로젝트 생성 강의 질문있습니다.
Hello JPA - 프로젝트 생성18분 3초에 mysql 사용시 2번째 네모박스 뿐만 아니라 첫번째 박스도 변경해야 하는거 아닌가요?2. Hello JPA - 애플리케이션 개발 3분 8초해당 강의 부분에서 EntityManagerFactory emf =Persistence.createEntityManagerFactory("hello"); 입력후 실행하면 커넥션이 떠야 한다고 했는데 저는 커넥션이 안뜨는데요.아래같이 뜹니다. 어떻게 해야 하나요? public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf =Persistence.createEntityManagerFactory("hello");//persistence.xml에서 유닛 네임을 넘겨주면 된다. // EntityManager entityManager=emf.createEntityManager(); // entityManager.close(); // emf.close(); } } 3. 6분에서 빨간색 네모박스는 왜 안지워요?8분22초에서 distance가 뭘 의미하는건가요?17분 3초에서 아래 문장이 엔티티 매니저가 찾는 것을 Member객체 형태로 findMember의 변수로 저장해라 라는 문구로 이해 해도 되나요? Member findMember=em.find(Member.class,1l);근데 Member.class 이건 왜나오는거에요? 29분에 쿼리문 설명할 때 엔티티를 표현한다거나 객체를 표현하는걸로 이해하시면 된다고 하셨는데요.https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=zzu0e&logNo=220689973139 근데 이 주소를 보면 두개 가 다른것 같은데 뭐가맞는건가요?31분에 와스가 내려갈때 emf를 닫아줘야 한다고 하셨는데 와스가 뭐에요?