묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
ModelMapper에 대해 질문드립니다 !!
안녕하세요!엔티티 -> DTO, DTO -> 엔티티 변환 모두 STRICT 전략을 사용하는 modelMapper.map을 사용하고있습니다.DTO를 쓰는 이유 -> 엔티티가 바뀌어도, dto는 그대로이므로 api 스펙이 바뀌지않음.그런데 STRICT 전략을 쓰는 modelMapper를 사용하면,dto와 엔티티 필드이름이 정확하게 일치해야하므로엔티티가 바뀌면 dto 필드도 바뀌어야함. 이렇게 되면 엔티티 변경 시에 api 스펙이 바뀌지않는다는 장점이 없어지게됨이런 생각이 들었는데, 그럼 STRICT 전략은 지양해야하나요, 아님 다른 방법이 있는 것인가요?
-
미해결클론코딩에서 알려주지 않는 것들 (보안, DDD, 마이크로서비스) 2편
로그인 기능 구현 (Application Layer 실습) 에서의 질문
안녕하세요 질문이 있습니다.로그인 기능 구현 (Application Layer 실습) 강의에서 9:10초쯤에 스프링에서 디비객체를 도메인객체로 자동으로? 변환해주는게 있다고 하셨는데요. 어떠한 기능일까요? 알려주시면 감사하겠습니다.
-
미해결스프링 배치
step-in-muti-thread 질문
안녕하세요 강의에서 학습하고 디버깅한 바탕으로 제 생각이 맞는지 궁금하여 질문 드립니다. 1. 4개의 스레드 풀이 존재하고 chunkSize=100, pageSize=300을 주었다고 쳤을 때 맨 처음 스레드가 데이터 베이스에서 300개를 조회2. AbstractPagingItemReader의 CopyOnWriteArrayList에 저장하고 이후 다른 스레드들은 해당 Reader를 공유하여 락 메커니즘이 적용된 doRead() 호출하여 list(count++)에서 데이터를 하나씩 가져와 개별 스택 안의 Chunk에 설정한 chunkSize 만큼 저장3. 그 후 process -> write 이렇게 작동하여 단일 스레드가 100개씩 3번 처리를 멀티 스레드를 이용해 마치 한 번 만에 300개 처리가 가능하여 속도를 향상시키는 게 맞을까요?
-
미해결
스프링 도커 데이터베이스 연결 오류
현재 이것이 백엔드 개발이다 with 자바편 책을 보면서 학습중입니다.스프링부트에 도커에서 실행되는 데이터베이스(mysql)를 연동하려고 하는데 위와 같은 에러가 발생합니다.스프링부트 pom.xml 내용 중 mysql 의존성 부분application.properties 부분도커 컨테이너 생성에서 mysql 버전Application.java 책에서 나온 내용과 동일하게 진행했으며 스키마, 데이터베이스 테이블까지 만든 상태입니다. 어떤 것이 잘못된 건지 감이 잡히지 않습니다. 도움 부탁드려요
-
미해결
스프링 알림 1:N 발송 어떻게 구현해야할까요?
안녕하세요. 스프링으로 알림 서비스 API 만들어보고 있습니다.여기서 알림이라 하면, 인프런에서 '종 아이콘' 누르면 나오는 사이트 내부에 있는 알림입니다. 현재 Notification 테이블은 Member 테이블이 @ManyToOne으로 매핑되어있는 상태입니다.즉, 한 유저는 여러개의 알림을 가질 수 있습니다. 'OO님이 본인 게시글에 답글을 달았습니다'와 같은 1:1 알림 전송은 Notification insert가 댓글 달때 한번만 일어나므로 상관없지만, '스프링 핵심 원리 -기본편 강의에 새소식이 있어요!!'와 같은 1:N 알림을 보내려면, 스프링 핵심원리를 듣는 모든 수강생한테 알림을 보내야하니까, 수강생수만큼 Notification Insert가 나가야하잖아요??그러면 수강생 수가 100만명이면 Insert가 100만명 나가는건데, 너무 '비효율적'이고 'DB 공간 낭비'라고 생각되서요. 대규모 서비스에서 사용되는 좋은 방법 추천해주실 분 계신가요?인프런에서 1:N 알림은 어떤 방법을 쓰고 있을까요~?
-
미해결
토비님의 스프링, 스프링 부트 강의 중 뭘 먼저 듣는게 좋을까요?
스프링 부트 웹백엔드 개발자입니다. 토비님 강의가 있다는 소식을 접해서 들어보려고 하는데 스프링 강의와 스프링 부트 강의가 있더라구요. 둘 다 들으면 좋겠지만, 동시에 들을 수는 없잖아요. 그래서 뭘 먼저 듣는게 좋을지 고민이 되는데 스프링 부트는 강의를 들어봤는데, 스프링은 강의는 커녕 부트 없이 생으로 개발해본적이 없습니다. 스프링 강의 먼저 들어보는게 낫겠죠?
-
미해결
생성 메서드에 대한 질문있습니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발강의 내용에서 Order 클래스에서 생성메서드를 만들었습니다.//==생성 메서드==// public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) { Order order = new Order(); order.setMember(member); order.setDelivery(delivery); for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem); } order.setStatus(OrderStatus.ORDER); order.setOrderDate(LocalDateTime.now()); return order; }위의 Order 클래스에서 만든 생성메서드를 OrderItem 클래스에서도 만든 이유가 궁금합니다.//==생성 메서드==// public static OrderItem createOrderItem(Item item, int orderPrice, int count) { // 생성메서드는 언제 사용해야하는지 질문 OrderItem orderItem = new OrderItem(); orderItem.setItem(item); orderItem.setOrderPrice(orderPrice); orderItem.setCount(count); item.removeStock(count); return orderItem; }OrderItem 클래스에도 생성메서드를 만들어준 이유가 연관관계에 있어서 "다"인 쪽에 만드는건가요?(예를 들어서, 연관관계 1대 다에서 다 쪽에 생성메서드를 만드는 것인지에 대한 질문입니다.)
-
미해결
연관관계 메서드에 대해 질문드립니다.
@Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "delivery_id") private Delivery delivery; //배송정보 private LocalDateTime orderDate; //주문시간 @Enumerated(EnumType.STRING) private OrderStatus status; //주문상태 [ORDER, CANCEL] //==연관관계 메서드==// public void setMember(Member member) { this.member = member; member.getOrders().add(this); // Member 엔티티 부분 : private List<Order> orders = new ArrayList<>(); } public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); // OrderItem 엔티티 부분 : private Order order; orderItem.setOrder(this); } public void setDelivery(Delivery delivery) { this.delivery = delivery; // Delibery 엔티티 부분 : private Order order; delivery.setOrder(this); } member.getOrders().add(this) -> addOrderItem과 setDelivery에서는 setOrder(this)로 연관관계를 설정해줬는데, 왜 setMember 메소드에서만 getOrders().add(this)로 연관관계를 설정한 것인가요? Member 엔티티의 orders메소드가 List라 그런 것인가요? setMember에서는 같은 List임에도 불구하고 this.member = member라고 했는데, 왜 여기서는 add(orderItem)으로 연관관계를 설정한 것인가요? orderItems가 List라서 그런 것인가요?
-
미해결
get 방식과 post 방식 질문드립니다.
public class OrderController { private OrderService orderService; private MemberService memberService; private ItemService itemService; @GetMapping(value = "/order") public String createForm(Model model) { List<Member> members = memberService.findMembers(); List<Item> items = itemService.findItems(); model.addAttribute("members", members); model.addAttribute("items", items); return "order/orderForm"; } @PostMapping("/order") public String order(@RequestParam("memberId") Long memberId, @RequestParam("itemId") Long itemId, @RequestParam("count") int count) { orderService.order(memberId, itemId, count); return "redirect:/orders"; } } 제가 http관련 수업을 들었지만, 코드로 적용할 때, 좀 헷갈리는 부분이 있어서 질문드립니다. @GetMapping은 기본적으로 "order" url에 이동했을 때, 실행되는 것이 맞나요?order 페이지로 이동했을 때, 자동으로 createForm 메소드가 실행돼서 모델에 members와 items를 담고 order/orderForm으로 전달하는 절차가 맞나요? 반대로 @PostMapping은 기본적으로 "order" url에서 값의 전달이나 변경이 있을 때, 실행되는 것이 맞나요?order url에서 값을 입력하고 버튼과 같은 동작을 누르면, 그 때 order 메소드가 실행돼서 매개변수로 넘어온 memberId, itemId, count로 주문해서 저장하는 것이 맞나요? 결론적으로 차이점을 말하자면, get방식은 해당 url로 접속했을 때 실행되는 것이고, post는 해당 url에서 값을 변경이나 전달할 때 실행되는 것이 맞나요?
-
미해결
localhost 오류 질문드립니다.
package controller; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @Slf4j public class HomeController { @RequestMapping("/") public String home() { log.info("home controller"); return "home"; } } <!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head th:replace="fragments/header :: header"> <title>Hello</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <div class="container"> <div th:replace="fragments/bodyHeader :: bodyHeader" /> <div class="jumbotron"> <h1>HELLO SHOP</h1> <p class="lead">회원 기능</p> <p> <a class="btn btn-lg btn-secondary" href="/members/new">회원 가입</a> <a class="btn btn-lg btn-secondary" href="/members">회원 목록</a> </p> <p class="lead">상품 기능</p> <p> <a class="btn btn-lg btn-dark" href="/items/new">상품 등록</a> <a class="btn btn-lg btn-dark" href="/items">상품 목록</a> </p> <p class="lead">주문 기능</p> <p> <a class="btn btn-lg btn-info" href="/order">상품 주문</a> <a class="btn btn-lg btn-info" href="/orders">주문 내역</a> </p> </div> <div th:replace="fragments/footer :: footer" /> </div> <!-- /container --> </body> </html> <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <div class="header" th:fragment="bodyHeader"> <ul class="nav nav-pills pull-right"> <li><a href="/">Home</a></li> </ul> <a href="/"><h3 class="text-muted">HELLO SHOP</h3></a> </div> <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <div class="footer" th:fragment="footer"> <p>© Hello Shop V2</p> </div> <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head th:fragment="header"> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrinkto-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="/css/bootstrap.min.css" integrity="sha384- ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <!-- Custom styles for this template --> <link href="/css/jumbotron-narrow.css" rel="stylesheet"> <title>Hello, world!</title> </head> 이렇게 다 했는데 localhost:8080 누르면 아무 화면도 나오지않습니다. 어떤 오류때문에 그런 것인지 알 수가 없습니다.감사합니다.
-
미해결
코드분석중 질문드립니다.
@Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>(); } @Embeddable @Getter public class Address { private String city; private String street; private String zipcode; protected Address() { } public Address(String city, String street, String zipcode) { this.city = city; this.street = street; this.zipcode = zipcode; } } 위 코드에서, Adress 클래스의 멤버변수의 값은 언제 초기화되나요? 생성자가 호출되려면, 객체 인스턴스가 생성되어야 하는데, Address 인스턴스 객체가 생성될 일이 있나요?감사합니다.
-
미해결
강의 내용중 이해안되는 부분 질문드립니다.
@Entity @Table(name = "order_item") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class OrderItem { @Id @GeneratedValue @Column(name = "order_item_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") private Item item; //주문 상품 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") private Order order; //주문 private int orderPrice; //주문 가격 private int count; //주문 수량 //==생성 메서드==// public static OrderItem createOrderItem(Item item, int orderPrice, int count) { OrderItem orderItem = new OrderItem(); orderItem.setItem(item); orderItem.setOrderPrice(orderPrice); orderItem.setCount(count); item.removeStock(count); return orderItem; } //==비즈니스 로직==// //****************이 부분입니다**************************// /** 주문 취소 */ public void cancel() { getItem().addStock(count); } //==조회 로직==// /** 주문상품 전체 가격 조회 */ public int getTotalPrice() { return getOrderPrice() * getCount(); } }비즈니스 로직의 주문 취소에서 getItem().addStock(count)이 아니고 item.addStock(count)아닌가요? 어떻게 getItem()으로 addStock메소드를 호출가능한가요? 감사합니다.
-
미해결
강의 내용중 궁금한 점 질문드립니다.
//==생성 메서드==// public static OrderItem createOrderItem(Item item, int orderPrice, int count) { OrderItem orderItem = new OrderItem(); orderItem.setItem(item); orderItem.setOrderPrice(orderPrice); orderItem.setCount(count); item.removeStock(count); return orderItem; }이러한 생성메서드는 언제 사용하는건가요?코드를 분석해보니 연관관계에서 다 대 1인 케이스에서, '다'쪽에서 생성 메서드를 사용하는 것 같은데 맞나요?감사합니다.
-
미해결
강의 내용에서 이해안되는 부분 질문드립니다.
package jpabook.jpashop.domain; import jakarta.persistence.*; import jdk.jshell.Snippet; import lombok.Getter; import lombok.Setter; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; @Entity @Table(name = "orders") @Getter @Setter public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Delivery delivery; //배송정보 private LocalDateTime orderDate; //주문시간 @Enumerated(EnumType.STRING) private OrderStatus status; //주문상태 [ORDER, CANCEL] //이 연관관계 부분입니다. //==연관관계 메서드==// public void setMember(Member member) { this.member = member; member.getOrders().add(this); } public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); orderItem.setOrder(this); } public void setDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this); } //==연관관계 메서드==// public void setMember(Member member) { this.member = member; member.getOrders().add(this); } public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); orderItem.setOrder(this); } public void setDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this); }이 연관관계 메서드 부분이 이해가 안되어서 질문드립니다.setMember 메소드에서 member.getOrders().add(this); 이 부분이 전혀 이해가 안되는데 설명 부탁드립니다. addOrderItem 메소드에서 orderItems.add(orderItem); 와 orderItem.setOrder(this); 이 부분이 전혀 이해가 안되는데 설명 부탁드립니다. setDelivery 메소드에서 delivery.setOrder(this); 이 부분이 전혀 이해가 안되는데 설명 부탁드립니다.
-
미해결
강의 내용에 의문점이 생겨 질문드립니다.
package jpabook.jpashop.domain.repository; import jakarta.persistence.Entity; import jakarta.persistence.EntityManager; import jpabook.jpashop.domain.item.Item; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import java.util.List; @Repository @RequiredArgsConstructor public class ItemRepository { private final EntityManager em; public void save(Item item) { if (item.getId() == null) { // 이 부분입니다. em.persist(item); } else { em.merge(item); } } public Item findOne(Long id) { return em.find(Item.class, id); } public List<Item> findAll() { return em.createQuery("select i from Item i",Item.class).getResultList(); } } 위의 코드에서 item.getId() == null을 왜 사용하는건가요??MemberRepository 클래스와 코드 형식이 거의 비슷한데, MemberRepository 클래스에서는 member.getId() == null 코드를 사용하지 않아서 질문드립니다.그리고 item은 처음에 id가 없다는 말도 이해안되어서 질문드립니다.감사합니다.
-
미해결
강의 내용 질문드립니다.
package jpabook.jpashop.domain.repository; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.persistence.PersistenceUnit; import jpabook.jpashop.domain.Member; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import java.util.List; @Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em; public void save(Member member) { em.persist(member); } public Member findOne(Long id) { return em.find(Member.class, id); } public List<Member> findAll() { // 회원 목록 조회 return em.createQuery("select m from Member m", Member.class) ry .getResultList(); } public List<Member> findByName(String name) { return em.createQuery("select m from Member m where m.name = :name", Member.class) .setParameter("name", name) .getResultList(); } } 위의 코드에서 findByName메소드에서 왜 단건조회가 아닌 리스트 조회를 사용한건가요? 어차피 중복가입은 안되고 이름으로 조회하니까 하나의 결과가 나와야하는거 아닌가요?findByName 메소드에서 setParameter은 왜 있는건가요? 설명부탁드릴게요.
-
미해결
강의 질문입니다.
@Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") // 맵핑된 거울. 여기에 값을 넣는다고해서 Foreign key 값이 변경되지 않음. private List<Order> orders = new ArrayList<>(); }위 코드에서, @GeneratedValue는 시스템상에서 생성되는 값이라는 의미의 어노테이션 맞나요? 그리고 Address 타입의 변수는 @Embedded인 이유가 무엇인가요?
-
해결됨
스프링 오류 질문드립니다.
package jpabook.jpashop; import org.assertj.core.api.Assertions; 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.annotation.Rollback; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; @RunWith(SpringRunner.class) @SpringBootTest public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional @Rollback(false) public void testMember() { Member member = new Member(); member.setUsername("memberA"); Long savedId = memberRepository.save(member); Member findMember = memberRepository.find(savedId); Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); Assertions.assertThat(findMember).isEqualTo(member); //JPA 엔티티 동일성 보장 } } 위의 코드를 실행했는데, 아래와 같은 오류가 나왔습니다. 해결책을 알려주시면 감사하겠습니다. ... 91 common frames omitted============================CONDITIONS EVALUATION REPORT============================Positive matches:----------------- NoneNegative matches:----------------- NoneExclusions:----------- NoneUnconditional classes:---------------------- None2024-04-17T00:07:39.846+09:00 WARN 5176 --- [ Test worker] o.s.test.context.TestContextManager : Caught exception while allowing TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener] to prepare test instance [jpabook.jpashop.MemberRepositoryTest@41a23470]java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@48368a08 testClass = jpabook.jpashop.MemberRepositoryTest, locations = [], classes = [jpabook.jpashop.JpashopApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@49cb9cb5, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@146587a2, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@16c63f5, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@6127a7e, org.springframework.boot.test.context.SpringBootTestAnnotation@8694b330], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] ... 55 moreCaused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) > Task :test FAILEDMemberRepositoryTest > testMember FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180 Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1786 Caused by: org.hibernate.service.spi.ServiceException at AbstractServiceRegistryImpl.java:276 Caused by: org.hibernate.HibernateException at DialectFactoryImpl.java:1911 test completed, 1 failedFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':test'.> There were failing tests. See the report at: file:///C:/study/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.7/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.BUILD FAILED in 6s4 actionable tasks: 1 executed, 3 up-to-date
-
해결됨
스프링 오류 질문
package jpabook.jpashop; import org.assertj.core.api.Assertions; 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.annotation.Rollback; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; @RunWith(SpringRunner.class) @SpringBootTest public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional @Rollback(false) public void testMember() { Member member = new Member(); member.setUsername("memberA"); Long savedId = memberRepository.save(member); Member findMember = memberRepository.find(savedId); Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); Assertions.assertThat(findMember).isEqualTo(member); //JPA 엔티티 동일성 보장 } } 김영한 강사님의 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 강의를 수강중입니다. C:\study\jpashop\src\test\java\jpabook\jpashop\MemberRepositoryTest.java:4: error: package org.junit does not existimport org.junit.Test; 위와같은 오류가 나왔는데 어떻게 해결하나요?
-
해결됨
스프링 용어 질문드립니다.
김영한 강사님의 스프링 강의 듣다가 궁금한 것이 생겼습니다.타임리프와 템플릿엔진을 인터넷에 검색해봐도 제대로 된 정의 설명이 없는데, 이 2개의 단어는 정확히 무슨 뜻인가요?