묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Transactional이 필요한곳과 필요없는곳
안녕하세요 service 관련 코드를 공부하다가 질문이 생겨서 문의드립니다.제가 지금까지 봤던 코드들은 @Transactional(readOnly = true) 는 Read할 때 사용을 하고 @Transactional은 Read를 제외한 CUD일 때 사용을 한다고 알고있는데, 인터넷을 찾아보니 "모든 CUD 관련 코드에 @Transactional을 무분별하게 사용하면 성능에 저하가 올 수 있다. 트랜잭션은 묶음의 처리입니다. 단건의 INSERT, DELETE, UPDATE 는 Transaction 이 필요하지 않습니다." 라고 블로그에서 보았습니다. 모든 CUD 관련 코드에다가 @Transactional을 붙이면 안되는건가요? 또한 @Transactional(readOnly = true) 는 Read 관련 코드에 붙이는게 필수는 아닌가요? 어떤 방식으로 코드를 짜는게 좋은 코드인지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
findBy 로 조회 시에, 조회 조건으로 PK vs Unique 제약조건 컬럼
테이블은 한 게시글 당 게시글 이미지를 여러 개 저장할 수 있도록 하는 postImage 테이블이고pk는 autoincrement인 Long 타입 postImageId입니다.그리고 unique한 조건은 @ManyToOne으로 매핑된 post(not null)와 imageUrl(not null) 컬럼의 조합입니다.이 때, postImage 엔티티를 조회하기 위해서는 pk인 postImageId로 조회하는게 좋을까요? 아니면unique 제약조건인 post+imageUrl로 조회하는게 좋을까요?실무에서 더 선호되는 방식이나 성능적, 설계적으로 좋은 방식이 궁금합니다
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
mutableListOf
강의를 들으면서 코틀린 문법도 같이 병행하면서 듣고있는데 이부분 질문을 하고 싶습니다!mutableListOf 로 감싸줘서 넣어져야지 코드가 오류 없이 되는지 궁금합니다. jpa 특성상 그런건가용?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Team 클래스에서 member를 List로 저장하는 이유
안녕하세요 강의 잘 보고있습니다!다름아니라 Member 클래스에서는 List를 쓰지않고 Team team으로 객체를 저장하셨는데Team 클래스에서는 List를 사용하여 member를 저장하는 이유가 궁금합니다.팀이 1이고 멤버가 N이여서 팀에 여러명의 멤버가 들어갈 수 있으므로 List를 사용하신걸까요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
한 부모테이블에 속한 자식 테이블들의 칼럼이 전부 NOT NULL일 경우
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]Item 부모 클래스를 Album , Book , Movie 자식 클래스들이 상속받는 상황에서 해당 자식 테이블들 칼럼들이 전부 NOT NULL일 경우 단일 테이블 전략을 쓰고 데이터를 삽입할 경우 다른 자식 객체에 값에 NULL이 들어감으로써 NOT NULL 조건을 위배하여 오류가 발생즉 이럴 경우 JOINED 전략을 통해 칼럼들이 NOT NULL이어도 테이블이 자식 별로 분리돼서 생성됨에 따라 NOT NULL 조건을 위반하지 않고 원활하게 삽입될 수 있습니다.[핵심 질문]하지만 규모가 크지 않은 프로젝트에서 선생님께서는 단일 테이블 전략이 좋다고 하셨는데, 규모가 크지 않은 프로젝트에서라도 일반적으로 칼럼들이 NOT NULL로 설정되는 경우가 많은데 이런 경우에는 불가피하게 무조건적으로 조인 전략(JOINED)을 채택해야하는지 여쭙고 싶습니다 !
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
스프링 부트가 제공하는 임베디드 DB DataSource 스프링 빈 자동 등록 관련
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요.H2 DB는 자바로 만들어져 있고, 덕분에 JVM 내부에서 동작하는 임베디드 모드를 지원한다고 이해했습니다.스프링 부트는 데이터베이스에 대한 별다른 설정이 없으면 임베디드 데이터베이스를 사용(제공)한다고 하는데..질문: 그렇다면 스프링 부트가 DataSource를 스프링 빈으로 자동 등록 시 라이브러리(의존 관계)에서 H2가 있는지를 먼저 확인하고, 별도의 설정(application.properties 내 url, username 등)이 없으면 임베디드 모드로 DataSource를 생성하여 빈으로 등록하는 건가요? 아니면 application.properties를 먼저 확인하고 url이 없으면 -> 라이브러리에 H2가 있는지 확인 후 메모리 DB를 사용하는 DataSource를 생성하여 빈으로 등록하는 건가요? 만약 후자라면 왜 그렇게 설계했을지(이점?)도 궁금합니다.. 감사합니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
즉시 로딩 상황에서 select문 호출에 대해 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]Member 클래스의 team이 즉시 로딩으로 설정된 상황에서 아래 코드와 같이 실행 했을 때, team 엔티티의 select문이 한번 밖에 호출 되지 않습니다.저는 member 엔티티를 다 순회하면서 select문을 호출 할 것으로 예상했는데, 이 경우는 어짜피 각 member들의 team이 모두 같기 때문에 JPA에서 알아서 해당 team만 호출 하는 것인가요? 이부분이 궁금하여 질문 드립니다.Team team = new Team(); team.setName("Team 1"); em.persist(team); Team team2 = new Team(); team2.setName("Team 2"); em.persist(team2); Member member = new Member(); member.setUsername("user1"); member.setTeam(team); em.persist(member); Member member2 = new Member(); member2.setUsername("user2"); member2.setTeam(team); em.persist(member2); em.flush(); em.clear(); List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList(); tx.commit();
-
미해결
스프링 알림 1:N 발송 어떻게 구현해야할까요?
안녕하세요. 스프링으로 알림 서비스 API 만들어보고 있습니다.여기서 알림이라 하면, 인프런에서 '종 아이콘' 누르면 나오는 사이트 내부에 있는 알림입니다. 현재 Notification 테이블은 Member 테이블이 @ManyToOne으로 매핑되어있는 상태입니다.즉, 한 유저는 여러개의 알림을 가질 수 있습니다. 'OO님이 본인 게시글에 답글을 달았습니다'와 같은 1:1 알림 전송은 Notification insert가 댓글 달때 한번만 일어나므로 상관없지만, '스프링 핵심 원리 -기본편 강의에 새소식이 있어요!!'와 같은 1:N 알림을 보내려면, 스프링 핵심원리를 듣는 모든 수강생한테 알림을 보내야하니까, 수강생수만큼 Notification Insert가 나가야하잖아요??그러면 수강생 수가 100만명이면 Insert가 100만명 나가는건데, 너무 '비효율적'이고 'DB 공간 낭비'라고 생각되서요. 대규모 서비스에서 사용되는 좋은 방법 추천해주실 분 계신가요?인프런에서 1:N 알림은 어떤 방법을 쓰고 있을까요~?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 설치 질문
제가 실수로 h2 server 를 지웠는지 저장한 설정에 h2 가 보이지 않습니다. 지우고 다시 설치해도 똑같네요 ㅠㅠ 어떻게 해야하나요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
동일한 엔티티를 2개의 필드 타입으로 정의하려면 어떻게 해야 할까요?
안녕하세요.JPA를 이용해서 스터디를 하다가 막히는 부분이 있어서 질문 드립니다. 우선 요구사항은 아래 내용입니다.신규 회원은 1명의 회원을 추천할 수 있습니다.회원은 본인이 추천받은 총 횟수를 알 수 있습니다.위 내용을 기반으로 엔티티를 Customer, Referee 2개를 생성 했습니다.그리고 Referee 엔티티에서 추천한 회원 ID와 추천받은 회원 ID를 필드로 가지려고 합니다. 추천한 회원 ID 필드는 OneToOne 관계로, 추천받은 회원 ID는 ManyToOne 관계로 풀고 싶습니다.이런 경우에는 어떤식으로 정의를 해야 할까요? @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Entity public class Referee extends CreatedDateTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "referee_id") private Long id; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "customer_id") private Customer customer; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "customer_id") private Customer refereeCustomer; } 감사합니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
섹션1의 첫번째강의에서 WebStorm으로 프로젝트 진행할때의 질문
WebStorm으로 작업하신다고 하시고 프로젝트 처음에 불러오는 과정이 안나와서 짐작으로 frontend/ch02_start폴더를 만들고 cmd콘솔에서 npm install react-router-dom진행했거든요. 근데 강사님이 실습하는 폴더구조가 다르거든요? 이 과정이 생략되어있어서.. src폴더, public폴더가 자동으로 안생기는데 임의로 src폴더 만들고 그냥 하는건가요? 중간 과정 생략된걸 짐작으로 따라하려다보니 확신이 안들어서 여쭤봅니다
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
인터페이스 테스트인데 왜 구현체가 나오는건가요?
코드를 보면 초기화를 MemoryItemRepository로 하지 않고 ItemRepository로 초기화를 했는데 인터페이스는 구현체가 아니라서 함수가 정의가 안 되어있는데 어디서 구현체를 들고와서 테스트가 진행되는건가요..?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
member db 미생성 및 NullPointerException 문의
build.grade 파일application.yml 파일Member 파일MemberRepository 파일MemberRepositoryTest 파일Assertions.assertThat 가 안되는부분은 QnA를 통해 해결하였습니다.h2 데이터베이스 접속은 되는상태이며 실행시 member 테이블이 생성되지 않습니다.그리고 아래와 같은 NullPointerException 이 발생하여 문의드립니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
31강 유저 정보 가져오기에서 질문 있습니다
유저 정보를 가져올 때 orElseThrow를 사용하면 userRepository에 입력되어 있는 findByName이 Optional로 선언되어야 한다고 문구가 뜹니다!근데 Optional<User>로 바꾸면 UserServiceV2에 @Transactional public void deleteUser(String name){ User user = userRepository.findByName(name); if(user == null){ throw new IllegalArgumentException(); } userRepository.delete(user); }user의 타입을 User로 할 수 없다고 떠서 Optional<User>로 바꾸면 userRepository.delete(user)가 파라미터가 적절하지 않다고 뜹니다ㅜㅜ일단, 구현은 하고 싶어서 userRepository에 findByName은 User 타입으로 정의하고// 4. 유저 정보를 가져온다 if(userRepository.findByName(request.getUserName()) == null){ throw new IllegalArgumentException(); } else{ User user = userRepository.findByName(request.getUserName()); // 5. 유저 정보와 책 정보를 기반으로 UserLoanHistory를 저장 userLoanHistoryRepository.save(new UserLoanHistory(user.getId(),book.getName())); }bookService를 이렇게 바꾸었는데 상관없을까요?어떤식으로 해결하는게 맞을까요...
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Data 애노테이션 질문입니다!
안녕하세요 김영한 강사님의 강의를 듣고 스프링부트를 공부중인 개발자 지망생입니다. 디름이 아니라 @Data 애노테이션에 대한 질문입니다. 다른 분들의 프로젝트 코드를 보던중저 애노테이션을 엔티티 클래스에 붙여놓은 코드를 보았는데 제가 힉습하기로는 저 애노테이션엔 세터가 내장되어있어 사용을 지양하는것으로 알고있는데시용해도되는지 시용해도된다면 언제 사용하는것인지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
설계할때 순서
안녕하세요 실전! 스프링 부트와 jpa활용1을 듣고있는데요설계할때 순서가 궁금합니다먼저 요구사항을 분석하고도메인모데을 설계한 후에테이블틀을 먼저 설계하는게 우선인가요아니면 엔티티 틀을 설계하는게 우선인가요학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepositoryTest 빌드 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]MemberRepositoryTest의 testMember에서 에러가 발생합니다. 에러 내용이 너무 길어 프로젝트 링크 첨부하였습니다. https://drive.google.com/file/d/1flmRAYvWXnIY-1BNrdd76dXY6YdL-kHn/view?usp=sharing
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
writer content
서버 쪽 이랑 이름이 다르면 데이터 바인딩이 안되지 않나요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
REQUIRES_NEW인데 rollback되는 이유가 궁금합니다.
@Service @RequiredArgsConstructor @Transactional public class UserService { public void createUser(CreateUserRequest request) { Users users = firebaseUsersRepository.findUsersByFirebaseUid(request.getFirebaseUid()) .orElseThrow(() -> new BusinessException("Not Found User", HttpStatus.INTERNAL_SERVER_ERROR)); User user = User.builder() .name(users.getDisplay_name()) .firebaseUid(request.getFirebaseUid()) .build(); userRepository.save(user); } } @Component @RequiredArgsConstructor @Transactional(propagation = Propagation.REQUIRES_NEW) public class BaseEntityAuditAware implements AuditorAware<User> { private final UserRepository userRepository; @Override public Optional<User> getCurrentAuditor() { try { return userRepository.findById(ApiLogger.getRequestCallerId()); } catch (Exception e) { return Optional.empty(); } } }createUser에서 userRepository.save(user)를 호출할때,JpaAudit기능을 이용하기 위해 구현해놓은 BaseEntityAuditAware에서 유저정보를 가져온 후, 실제 쿼리를 날립니다.이때, 전파속성이 REQUIRE_NEW이며, 발생한 모든 예외를 catch했으므로이 함수를 호출한 부모 함수로 해당 예외가 전달되지 않을 것이기때문에 rollback이 되지 않으리라 기대했지만실제로는 unexpectedrollbackexception이 발생하며 롤백이 되었습니다.null을 반환하는건 문제가 아닌것이,실제로 예외를 발생시키지 않으려고 위 코드를 아래와같이 변경하였더니 null값으로 정상적으로 insert쿼리가 날라갔습니다. @Override public Optional<User> getCurrentAuditor() { Long callerId = ApiLogger.getRequestCallerId(); if (callerId == null) return Optional.empty(); return userRepository.findById(ApiLogger.getRequestCallerId()); }어느부분이 잘못된것이며 제가 오개념을 잡고있는 부분이 어디일까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
zipkin.jar 윈도우용 파일 제공이 가능할지요?
먼저 좋은 강의 감사합니다. 현재 윈도우 환경에서 강의를 듣고 있습니다. 집킨 파트를 수강하는데 zipkin.jar 를 받을수 있는 방법이 없습니다. 윈도우에서는 강의에서 나온 curl 명령에서 bash 명령어가 먹지도 않고 해서 제대로 다운로드도 안됩니다. 해서 zipkin.jar 파일을 따로 올려주실수는 없으실지 문의 드립니다.