API도 Request와 Response로 데이터가 이동하기 때문에 Controller를 정의한다. 일반적으로 @Controller가 아닌 @RestController 어노테이션을 사용하는데, @RestController 는 @Controller에 @ResponseBody가 추가된 것으로 Json 형태로 객체 데이터를 반환할 수 있다. @RestController @RequiredArgsConstructor public class MemberApiController { ... } 1. Entity를 파라미터로 처리하지 않기(feat. 회원 생성) 하단의 코드는 회원을 추가하는 두 가지 방식이다. 첫 번째 방식은 Member Entity를 인자로 받아서 처리하고 있고, 두 번째 방식은 CreateMembe..
🌱 Spring
1. "준영속 엔티티"란? 데이터베이스에 식별자가 정확하게 있는 상태의 엔티티를 준영속 상태의 객체로, Persistence Context가 더이상 관리하지 않는 엔티티이다. Book 객체는 이미 DB에 한번 저장되어서 식별자가 존재한다. 이렇게 임의로 만들어낸 Entity도 기존 식별자(Id)를 갖고 있으면 준영속 엔티티로 볼 수 있다. // getId()로 꺼내온 book Book book = new Book(); book.setId(form.getId()); book.setName(form.getName()); ... 아래 Order Entity의 cancel 로직에서 OrderStatus를 변경하면 JPA가 관리하기 때문에 "변경 감지"를 통해 자동으로 반영된다. (굳이 orderRepositor..
Controller를 정의할 차례이다. 우선 HomeController를 작성하고, "/"의 URI에 해당하는 html을 정의한다. home.html에서는 Thymeleaf를 사용한다. @Controller @Slf4j public class HomeController { // Logger log = LoggerFactory.getLogger(getClass()); -> @Slf4j @RequestMapping("/") public String home() { log.info("home controller"); return "home"; } } # th:replace 렌더링 될 때 fragments/header, bodyHeader, footer로 대체하는 코드이다. 1. Member 등록 회원 등록을 ..
1. 주문 Entity와 도메인 모델 패턴 다음 패턴은 OrderService에서 정의되어야 할 여러 로직들을 Entity에서 정의하는 도메인 모델 패턴의 코드이다. 주문 생성, 취소, 조회를 담당하는 코드를 작성하였다. 1) @NoArgsConstructor(access = AccessLevel.PROTECTED) 앞서 설명하였듯 도메인 모델 패턴의 코드에서는 Entity에서 비즈니스 로직을 정의하고, Service에서는 이를 호출하여 기능을 구현하는 것이다. 그렇다면 이전 방법처럼 new를 통해 객체를 생성하고 값을 주입하는 방법은 사용할 수 없을까? // 도메인 모델 패턴 OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), ..
1. 상품 Entity 개발 1) 도메인 주도 설계(DDD) 지향 비즈니스 로직 추가 도메인 안에서 해결할 수 있는 비즈니스 로직은 최대한 도메인 내에서 정의하는 것이 바람직하다. @Setter로 외부에서 값을 강제로 주입하는 것은 오히려 객체 지향적이지 못한 개발이다. 이에 앞서 개발한 Item Entity 내에서 stockQuantity의 증가/감소 비즈니스 로직을 구현하고자 한다. 다른 Entity에 정의한 프로퍼티를 인자로 받는 것이 아닌 stockQuantity만으로 처리할 수 있으므로 Entity 내에서 정의할 수 있다. @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @Getter @Setter public abstract cla..
1. 단위 테스트 환경 설정 1) Junit4 @RunWith(SpringRunner.class), @SpringBootTest Service Class에서 [cmd + Shift + T]를 통해 테스트 코드를 생성할 수 있다.(Junit4) 이때 단위 테스트를 정의하는 클래스에 @RunWith(SpringRunner.class)와 @SpringBootTest 어노테이션 함께 추가하는데 왜 그럴까? @RunWith 어노테이션은 테스트 실행방법을 확장할 때 사용하는 어노테이션으로, 만약 @SpringBootTest만 사용하면 application context를 전부 로딩해서 자칫 잘못하면 무거운 프로젝트로서의 역할을 할 수 있다. 하지만 Junit4에서 지원하는 @RunWith(SpringRunner.c..
1. 회원 Repository 개발 @Repository public class MemberRepository { // EntityManager를 주입할 수 있다. @PersistenceContext private EntityManager em; private void save(Member member) { em.persist(member); } // 조회 - id private Member findOne(Long id) { return em.find(Member.class, id); } // 전체 조회 private List findAll() { // JPQL(Entity를 대상으로 Query) return em.createQuery("select m from Member m", Member.class..
1. 도메인 모델과 테이블 설계 및 도식화 본 실습에서는 다양한 객체간 관계(1:1, 1:N, N:N)에 대해 실습하기 위해 실무에서의 설계와는 상이한 가상의 모델과 테이블을 설계한다. 예를 들어 회원이 주문을 하기 때문에 Member와 Order의 관계가 1:N으로 표현한 것이 잘 설계된 것처럼 보이지만, 실무에서는 회원이 주문을 참조하지 않고, 주문이 회원을 참조하는 것으로 충분하다. 객체 테이블 분석 ITEM 테이블은 하나의 테이블에 Album, Book, Movie 객체를 다 넣은 후, DTYPE으로 구분하는 싱글 테이블 전략을 사용한다. CATEGORY와 ITEM이 서로 N:N 관계를 가지기 때문에, CATEGORY도 ITEM 객체를 List로 가져도 되고, ITEM도 CATEGORY 객체를 L..
1. 초기 프로젝트 구성 Lombok 환경 설정 1. Settings → Plugins → Lombok 검색 → 설치되었는지 확인 2. Preferences → Compiler → Annotation Processors의 Enable Annotation Processing 체크 3. Preferences → Build Tools → Gradle -> Build and run using, Run tests using: IntelliJ IDEA로 변경 자바로 바로 실행하게끔 하여 Gradle로 빌드하는 것보다 속도가 더 빠르다. 추가 공부할 라이브러리 1. Hikari Connection Pool (Spring Boot 기본) 2. Hibernate 3. 스프링 ORM 4. 스프링 데이터 JPA 5. 로깅:..
Item 상세 @PathVariable URI에 변수가 들어가는 경우 처리해줄 때 사용하는 어노테이션이다. // 아이템 상세 @GetMapping("/{itemId}") public String item(@PathVariable long itemId, Model model) { Item item = itemRepository.findById(itemId); model.addAttribute("item", item); return "basic/item"; } Item 등록 메서드를 통해 기능을 구분지었다. (@GetMapping, @PostMapping) // 아이템 등록 @GetMapping("/add") public String addForm() { return "basic/addForm"; } // ..