묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
JPA 식별관계 사용에 대해서...
Jpa를 사용할 때 테이블 관리를 쉽게 하기 위해서 비식별 관계로 테이블을 설계하라고 들었는데 그러면 실무에서 jpa쓸 때 식별관계를 안쓰나요?
-
해결됨토비의 스프링 부트 - 이해와 원리
DI를 이용한 Proxy패턴 관련 질문
DI를 이용한 Decorator, Proxy 패턴 듣고있는데요. 강의자료에 프록시 패턴의 프록시와 일반적용 용어 프록시, 자바의 다이나믹 프록시가 동일한 건 아니다. 이게 혹시 어떤내용인지 좀 더 알 수 있을까요?
-
미해결스프링 핵심 원리 - 고급편
강의에서 사실 의미없다고 모니터링툴을 쓰면 된다고 하는데
강의에서 사실 의미 없다고 모니터링 툴을 쓰면 된다고 하는데 어떤 툴을 써야하나요?진입 시점을 알려주는것보면 그냥 오류메시지를 전달하는 형태는 아닌 것 같고,센트리라는 것을 사용하면 저런형태로 커스터마이징 할 수 있는건가요?저번에 제가 도입해보려다가 무료기간이 1주일정도라서, 그냥 err메시지를 슬랙으로 전송해주는 모니터링만 구현했었거든요...말씀하시는 모니터링툴이 무엇인지 알고싶습니다 김영한 선생님!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JUnit 테스트 콘솔에서 SQL문
JUnit 테스트 콘솔의 SQL문에서 1차 캐시에서 엔티티를 조작하고 있는지 아니면 데이터베이스에서 DML문을 써서 조작하고 있는지 확인을 하고 싶은데, JUnit 테스트 코드 실행후 콘솔창을 보면, SQL문은 정상적으로 나오는데, 1차 캐시에서 삭제한건지 데이터베이스에서 삭제를 시도한건진 확인이 안됩니다. 확인할 수 있는 방법이 있을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
' 생략 여부 관련 질문
<span th:text="10 + 2"></span> <span th:text="10 % 2 == 0"></span>'(작은따옴표) 생략 여부 관련해서 여쭤보고 싶습니다.첫 번째 줄에서, 10+2 덧셈 연산이 이뤄진 후에 <span th:text="12"></span>이 되는데, 여기에서 사실은 '12'로 ''가 생략된 것인가요? 12가 숫자가 아닌 문자열로 인식되는 것이 맞나요?마찬가지로 두 번째 줄에서, <span th:text="true"></span>가 되는데, 사실은 'true'로 ''가 생략된 것인가요? true가 boolean형이 아닌 문자열로 인식되는 것이 맞나요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
영속성 전이 관련해서 질문드립니다.
안녕하세요 강의 수강 후 활용해서 프로젝트를 진행중인데, 영속성 전이 관련해서 질문이 있습니다.강의 내용처럼 Order에 있는 member에 다음과 같은 설정을 하면@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="member_id") private Member memberId;object references an unsaved transient instance - save the transient instance before flushing에러가 발생합니다.그래서 다음과 같이 영속성 전이 설정을 하면 에러는 안뜨지만 같은 멤버가 두번씩 저장되는 문제가 발생합니다.@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) @JoinColumn(name="member_id") private Member memberId;해당 Order가 Create되면서 Member테이블에 member가 저장되는데 이미 해당 멤버는 db에 저장되어있는 상황. (회원가입하면서 멤버가 저장되어있었음)ㄴ test05가 두번 저장되어있음강의 코드는 Order에 영속성 전이 코드를 넣지 않아도 되던데 해당 에러를 발생시키지 않으려면 어떻게 해야할까요?Member 엔티티와 Order 엔티티 코드 입니다.@Entity @Table(name = "ORDERS") @NoArgsConstructor @Getter public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="member_id") private Member memberId; @Column(name = "post_id") private Long postId; @Embedded private Point price; @Column(name="order_at") private Timestamp orderAt; public static Order of(Member member, Long postId, Point price){ Order order = new Order(); order.setMember(member); order.postId = postId; order.price = price; return order; } public void setMember(Member member){ this.memberId = member; member.getOrders().add(this); }@Entity @Table(name = "member") @Getter @Setter @NoArgsConstructor @SQLDelete(sql = "UPDATE member SET deleted_at = NOW() where id = ?") @Where(clause = "deleted_at is NULL") public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "member_id") private String memberId; private String password; @Column(name = "member_name") private String memberName; private String email; @Column(name = "role") @Enumerated(EnumType.STRING) private MemberRole role = MemberRole.USER; @OneToMany(mappedBy = "memberId") private List<Order> orders = new ArrayList<Order>(); public static Member of(String memberId, String password, String memberName, String email){ Member member = new Member(); member.setMemberId(memberId); member.setPassword(password); member.setMemberName(memberName); member.setEmail(email); return member; } public static Member of(MemberDto dto){ Member member = new Member(); member.setMemberId(dto.getMemberId()); member.setPassword(dto.getPassword()); member.setMemberName(dto.getMemberName()); member.setEmail(dto.getEmail()); member.setRole(dto.getRole()); return member; }
-
해결됨스프링 프레임워크는 내 손에 [스프2탄]
/board/get?idx=${vo.idx} 질문
상세보기 구현하는 과정에 있어서 궁금한점이 있어서 질문드립니다.get이라는 컨트롤러를 만들고 /board/get?idx=${vo.idx}에서 선택한 idx에 따라서 링크가 이동되는것은 강의에서 잘 풀어주셔서 이해가 잘가는것 같습니다.질문을 드리자면 단순하게 get?idx <--- 여기서 물음표를 넣으셨는데 이건 정해진건지 궁금하고 어떤 이유에서 ?가 적힌건지 궁금합니다. get!!idx 이런식으로 적으니까 안되더라구요 ㅠㅠ...연휴 잘보내시길 바라면서 질 좋은 강의에 감사 드립니다!
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
bean 인식이 안됩니다.
jpa 라이브러리 추가했고 application 설정도 다 하고 @Configuration 애노테이션도 넣었는데 EntityManager가 빈으로 등록되어 있지 않다고 나옵니다. 왜 이러는걸까요? 프로젝트 링크: https://drive.google.com/file/d/1x_OeOhEBOKSNTiuzUqxY-zSyQmsmon5n/view?usp=share_link
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
java.sql 패키지 suggestion 인식 안됨
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]실습 중 Connection의 auto suggestion이 안되는 것 같습니다..(jdk 버전 17, 11 모두 안되는 것을 확인했습니다.)import java.sql.*; 를 수동으로 넣어줬을때는 빨간줄 없이 잘 되기는 합니다. 하지만 auto completion이 안되니까 너무 불편하더라구요.(java.sql이 아닌 다른 라이브러리는 auto completion 잘 됩니다.)혹시 저와 같은 오류를 겪어보시거나 이런 경우의 해결방법이 있을까요.? intellij의 community version 사용 중입니다!
-
미해결스프링 핵심 원리 - 기본편
스프링 빈 호출시 질문있어요 !!
스프링 부트 쓸때는 그냥 편하게 스프링 빈 가져왔는데 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy",DiscountPolicy.class);본 강의에서는 이처럼 ac 객체만들고 ac.getBean()해서 들고오는 이유가 뭐죠 ?? 제 생각에는 클래스 2개가 둘다 스프링 빈 등록시 그냥 편하게 가져와서 쓰면 된다. 하지만 만일 A클래스는 스프링빈 등록 x, B클래스는 스프링 빈 등록 시A에서 B객체를 들고 올때는 강의와 마찬가지로 ac.getBean()으로 들고와야 한다 혹시 맞나요 ??
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
순수JDBC 부분 실행 오류
입문 강의의 순수 JDBC 부분에서 제일 마지막 부분입니다. 제일 마지막으로 프로그램 실행을 해서 데이터베이스가 잘 작동하는지 확인하는데 강의안에 코드를 모두 복붙했기 때문에 오타는 없을건데 SpringConfig에서 저렇게 두개가 오류가 납니다.첫번째 오류는 SpringConfig 파일 위치를 옮겨서 해결했는데 그 다음 오류인 위의 사진에서 빨간색 글씨로된 부분은 왜 오류가 나는지 모르겠습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
./gradlew build 하고나서 인텔리에서 오류가 납니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]우선 개발환경은 우분투 22.04 버전입니다. 재부팅은 해보았습니다.그래들을 빌드(sudo ./gradlew build)하고나서는 인텔리제이에서 run하면, 빨간 글자로unable to delete directory~오류가 발생합니다. gradle clean을 하면 인텔리에서 정상으로 실행됩니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
이번 강의에 대한 질문이 있습니다.
아직 개인적으로 개발 공부 중인 저에게 너무 앞서가는 내용이 아닌가 싶기도 하고 실제로 Map 등 java에 관한 이해가 아직 부족해서 이 부분을 패스하고 나중에 필요할 때 다시 들어도 공부하는 틀에 큰 지장이 없는지 여쭤보고 싶습니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
JdbcTemplate 단건 숫자조회 관련 문의
안녕하세요, 강의 잘 듣고 있습니다.다름이 아니라 섹션2 - JdbcTemplate 정리의 단건조회 - 숫자조회 부분에서 int rowCount = jdbcTemplate.queryForObject("select count(*) from t_actor", Integer.class);부분에서 NamedParameterJdbcTemplate의 queryForObject에는 위처럼 SQL문과 자료형만 넣는 메서드를 찾을 수 없었고 중간에 Collections.emptyMap()을 넣거나, 아니면 query 메서드를 사용해야 하는 것으로 보이는데이 부분은 NamedParameterJdbcTemplate에서는 그대로 사용할 수 없고 그냥 JdbcTemplate을 사용할 때만 실행가능한 코드인건지 궁금합니다.
-
미해결실전! 스프링 데이터 JPA
하나의 작업을 여러 서비스 계층에서 나눠서 할때 트랜잭션 처리
예를들면 하나의 게시글을 처음 작성하며 여러 태그도 함께 붙이는 내용을 구현할 때 게시글 관련해서 PostService, 태그 관련해서 TagService로 처리를 한다고 가정해보겠습니다. public ResponseEntity(@RequestBody PostRequest postRequest) {Post post = postService.post(postRequest.toPost());tagService.addTag(postRequest.toTag());return ResponseEntity ...;}이런 형태이고 post() 메서드를 통해 게시글을 저장하고addTag() 메서드를 통해 태그를 저장한다고 할때 서로 다른 서비스 클래스의 메서드에 @Transactional 이 걸려있어서 만약 Post 엔티티를 저장한 후 Tag 엔티티를 저장해야 하는 상황에서 중간에 문제가 발생한다면 Tag는 저장이 안되었지만 Post는 저장이 되는 문제가 발생합니다. 간단하게 상황 설명만을 위해 작성한 예시라 내용이 이상하지만 이런 상황에서 트랜잭션을 한번에 처리할 방법이 있을까요? 결국 하나의 트랜잭션에서 처리해야할것 같아서 위 예시의 경우 postService에서 TagService의 addTag를 호출하는 형태로 하면되지 않을까 고민해 봤습니다.보통 이런식으로 한번에 처리해야 하는 로직이 여러 서비스 계층에 나누어 있는 경우? 처리를 어떤식으로 하는지 어떤 방법들이 있는지 궁금합니다.
-
해결됨토비의 스프링 부트 - 이해와 원리
Springboot version(start.spring.io)
https://start.spring.io/현재는 2.7.6은 보이지 않아, 우선 인텔리제이에서의 프로젝트 생성 마법사로 설정하거나, springboot cli로 설치해야 할 것 같아 공유드립니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
assertThrows() 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]assertThrows 메서드를 사용해 주문 취소 테스트 예를 실행하던 중 궁금한 점이 생겨 질문을 남깁니다.배송 완료 상황일 때는 취소가 되지 않는 예외를 적용한 것에 대해 제가 작성한 테스트인데요. 아래 코드를 통해 말씀드리겠습니다.// given Member member = createMember(); Item item = createBook("JPA", 10000, 10); int orderCount = 2; int curStock = item.getStockQuantity(); Long orderId = orderService.order(member.getId(), item.getId(), orderCount); // when // 배송 완료 상태면 취소가 안됨 Order getOrder = orderRepository.findOne(orderId); getOrder.getDelivery().setStatus(DeliveryStatus.COMP); IllegalStateException e = assertThrows(IllegalStateException.class, () -> orderService.cancelOrder(orderId)); Assertions.assertThat(e.getMessage()).isEqualTo("이미 배송완료된 상품은 취소가 불가능합니다."); // order 취소되는 경우를 가정하고 위에서 테스트했다고 쳤을 때 어떤 상태인지 보고 싶음! System.out.println(orderRepository.findOne(orderId).getStatus()); 아래와 같이 getStatus를 출력해보면 CANCLE이 아닌 ORDER라고 출력이 됩니다.getOrder.getDelivery().setStatus(DeliveryStatus.COMP); IllegalStateException e = assertThrows(IllegalStateException.class, () -> orderService.cancelOrder(orderId)); Assertions.assertThat(e.getMessage()).isEqualTo("이미 배송완료된 상품은 취소가 불가능합니다."); // order 취소되는 경우를 가정하고 위에서 테스트했다고 쳤을 때 어떤 상태인지 보고 싶음! System.out.println(orderRepository.findOne(orderId).getStatus());바로 이 부분인데요. assertThrows 내에서 orderCancle을 진행해서 테스트를 진행하는데 왜 주문의 상태가 CANCLE이 아닌 ORDER로 출력이 되는 지 알 수 있을까요?객체의 얕은 복사, 깊은 복사와 관련이 있는 것인지 궁금합니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
인텔리제이 무료 버전도 학습에 지장없나요?
지장없다는 말도 있고 있다는 말도 있던데 저는 김영한님 로드맵 2개 다 들을 예정인데 강의가 몇십 개 있더라구요 인텔리제이 무료 버전을 써서 막히는 부분들이 있을까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]복습 중 궁금한 것들이 생겨서 질문 드립니다. 1. @Repository 어노테이션을 붙이면 이 클래스는 EntityManager 가 관리하는 클래스가 된다는 걸 의미하나요? 2. @Transactional(readOnly = true) 를 이용하면 영속성 컨텍스트에 관리를 받지 않게 된다고 하는데 이것이 어떤 이점이 있는지 궁금합니다. 3. MemberController 에서는 @Valid 를 사용했는데 ItemController 의 create 메서드에서는 왜 @Valid 를 사용하지 않았는지 궁금합니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
강의 13:26 질문드립니다.
강의 교안을 보면 '응답의 경우에도 @ResponseBody를 사용하면 해당 객체를 HTTP 메시지 바디에 직접 넣어줄 수 있다.'고 작성되어 있습니다.여기에서 '객체를 HTTP 메시지 바디에 넣는다'는 말에 대해 여쭤보고 싶은데요, HTTP 메시지 컨버터에 의해 문자열로 바뀐 것이 바디에 실린다는 뜻이 맞을까요?