스프링 347

27. JPA 예외

앞서 JPA는 EntityManager를 통해 사용한다고 했다. EntityManager는 순수 JPA기술이다. 스프링과는 관계가 없다. 따라서, 예외도 JPA관련 예외를 발생시킨다. (아닌 것도 있긴 하다.) PersistenceException 및 하위 그럼 또 예외를 JPA라는 특정 기술에 의존하게 될 수도 있다. 그렇다면 어떻게 스프링 예외(DataAccessException)으로 변화할까? 바로 @Repository이다. 우리가 Spring MVC에서 @Controller, @Service, @Repository 이렇게 있는데, 일단 기본적으로 컴포넌트 스캔의 대상이 되고, (컴포넌트 스캔의 범위 내라면. 스캔범위를 설정 안해놓으면 main이었나 java였었나.. 여튼 되게 상위부터 스캔했음) ..

26. JPA 적용

아무래도 가장 중요한 부분은 객체와 테이블을 매핑하는 거다. JPA가 제공하는 다양한 애노테이션을 사용하여 매핑하면 된다. @Data @Entity //@Table(name="item") public class Item { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name="item_name", length = 10) private String itemName; private Integer price; private Integer quantity; public Item() { } public Item(String itemName, Integer price, Integer quantity) { this...

25. ORM -JPA

JPA란 Java Persistence API 직역은 자바 영속성 API 라는데... DB가 영속성이라서 그런건가. JPA의 기본 컨셉은 자바 컬렉션 컬렉션에 add하거나 remove 하는 것 처럼. 자바 진영의 ORM 기술 표준임. 즉, 인터페이스 ORM은 Object Relational Mapping 객체 관계형데이터 맵핑 객체는 겍체대로 설계하고 DB는 DB대로 설계 하는데 ORM이 중간에서 매핑해 줌. 대부분 대중적인 언어는 ORM 기술이 존재함. ORM은 RDB와 객체를 이어주는 기술임. RDB도 잘 알아야 함. ORM 에러의 많은 부분이 DB에서 일어날 거임. 결국 얘도 JDBC를 쓰는 거긴 함. 일종의 뭐 우리가 리스트 쓰듯이 (list.add()) 하듯이 하면 그걸 쿼리문으로 바꿔서 JDB..

24. ORM

지금 시대는 객체를 관계형 DB에 관리 관계형 DB는 sql만 알아들으므로 SQL 의존적인 개발을 피하기 어려움 개발자가 SQL 매퍼 역할을 하는 중 관계형 DB는 상속관계도 없음. 비슷한 게 있긴 하지만 (Super타입, sub타입) 복잡함. 보통 클래스 자체를 DB에 맞춰 정의함. 도메인 말하는 듯. 그리고 만약 예를 들어 Member 객체가 Order 객체를 가지고 있다고 생각해 보셈. 클래스로써는 상상이 가지만 DB에서는 어떻게 구현할거임? 이럴 경우 보통 Order의 Id를 가지고 있다가 따로 Order 테이블에서 JOIN 시킴. JOIN : sql 명령어 중 하나. 둘 이상의 테이블을 연결해 데이터를 검색하는 방법. 적어도 하나의 컬럼을 공유하고 있어야 하며, 이 컬럼을 PK또는 FK값으로 사..

22. 마이바티스 기능들.

마이바티스 사용하는 최고의 이유는 if, chose, trim, foreach 등의 동적쿼리 기능 때문 대충 이런 식임. choose는 뭔가 switch와 비슷한데, 근데 특정 값이 case가 아니라 조건문임 참일 시 넣을 내용 참일 시 넣을 내용 위의 조건이 모두 만족하지 않을 시 이걸로 넣음. and ~~~~ and ~~~~ and ~~~~ 만약 저기 안에 하나도 안 맞으면 where조차 안 붙임. 근데 하나라도 맞으면, where and는 sql문법 오류이므로 and를 지워줌. 첫번째면. 그 다음부터 맞은 것들은 and 붙여줌. 그러니까 뭔가 알아서 똑똑하게 where ~~~~ and ~~~~ and ~~~~ 이런 형식을 맞춰준다는 거임. ~~~~ 만약 접두사(prefix)에 and나 or가 있으면..

21. 마이바티스 적용2

@Configuration @RequiredArgsConstructor public class MyBatisConfig { private final ItemMapper itemMapper; @Bean public ItemService itemService(){ return new ItemServiceV1(itemRepository()); } @Bean public ItemRepository itemRepository(){ return new MyBatisItemRepository(itemMapper); } } ItemMapper가 @Mapper 이거 붙여서 xml이랑 연동되서 뭔가 구현체로 하나 만들어 진 후 빈으로 등록된다. 그래서 주입받을 수 있다. 근데 인텔리제이 문제인지 빨간 줄 뜨기는 하는데, ..

20. 마이바티스 적용 1

@Mapper public interface ItemMapper { void save(Item item); void update(@Param("id") Long id, @Param("updateParam") ItemUpdateDto updateParam); Optional findById(Long id); List findAll(ItemSearchCond itemSearch); } 먼저 인터페이스를 만듦. 이건 마이바티스 매핑 XML을 호출해주는 매퍼 인터페이스. @Mapper를 꼭 붙여야 인식됨. @Param은 파라미터 하나일 경우에는 안넣어도 되는데, 2개 들어갈 때는 넣어줘야 함. 아마 하나면 알아서 인식해서 되는 듯 함. 그러니까, 따져보면 다 매개변수들이 @Param 붙어있어야 하는데 하나라서 ..

19. MyBatis 설정

먼저 라이브러리에 추가 시켜줘야 한다. build.gradle에 implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0' 뒤에 버전정보가 붙어야 하는 것들은, 스프링이 공식지원을 하지 않는 것 들이다. 여튼 라이브러리에 추가 하고, mybatis.type-aliases-package=hello.itemservice.domain mybatis.configuration.map-underscore-to-camel-case=true logging.level.hello.itemservice.repository.mybatis=trace application.properties에 이렇게 추가해 준다. mybatis.type-aliases-p..

18. MyBatis

MyBatis는 JdbcTemplate보다 더 많은 기능을 제공하는 SQL Mapper임. JdbcTemplate가 제공하는 대부분의 기능을 제공. 그래서 MyBatis를 선택했다면 둘이 병행하지 않고 MyBatis만 사용해도 충분할거임. 가장 매력적인 점은 SQL을 XML에 편리하게 작성할 수도 있고, 동적 쿼리도 편리하게 작성할 수 있음. xml에 쓴 거 동적쿼리. 보통 JPA를 쓰다가도 순수쿼리를 작성하여 처리해야 할 때가 있다. 그때도 보통 JdbcTemplate를 쓰면 대부분 해결이 된다. 근데 좀 복잡하게 동적쿼리로 작성해야 할 때면 MyBatis를 쓰면 된다. MyBatis는 별도로 조금 설정을 해줘야 할 필요성이 있다. 이게 단점이라면 단점이다. 그리고 공식문서를 한글로 누가 번역을 잘 해..