목록프로그래밍 (409)
쌓고 쌓다
roleType VS role_type 자바는 단어와 단어 구별을 roleType 같은 카멜(Camel) 표기법을 사용한다. 데이터베이스는 관례상 role_type과 같은 언더스코어(_)를 사용한다. 아래와 같이 필드명을 "roleType"를 했다면 DB에 매핑되는 컬럼명은 "role_type"이 된다. @Column(name="role_type") String roleType 게시판 만들며 왜 이렇게 매핑이되나 싶었는데 궁금증 해결...! 데이터베이스 스키마 자동 생성 JPA는 엔티티의 매핑 정보를 통해 어떤 컬럼을 사용하는지 알 수 있으므로 맞는 방언으로 데이터베이스 스키마 자동 생성한다. ( 애플리케이션 실행 시점에 생성함 ) 옵션 설명 create 기존 테이블을 삭제하고 새로 생성 DROP + C..
웹 애플리케이션에 클라이언트가 서비스를 요청한다. 스프링이 없는 AppConfig는 그떄마다 객체를 생성하여 응답한다. 아래의 예를 보자. AppConfig @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberReposi..
댓글(Comment) 테이블 생성 CREATE TABLE comment ( id bigint NOT NULL auto_increment, pno bigint NOT NULL, writer VARCHAR(100) NOT NULL, content VARCHAR(300) NOT NULL, regdate DATETIME NOT NULL, PRIMARY KEY(id), FOREIGN KEY(pno) REFERENCES poster(id) ); 댓글이 포함되는 게시글의 PK를 외래키 pno로 가진다. 댓글(Comment) 클래스 생성 @Entity public class Comment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id..
동일 타입 조회 먼저 스프링 빈 설정 정보를 보자. SameBeanConfig @Configuration public static class SameBeanConfig { @Bean public MemberRepository memberRepository1() { return new MemoryMemberRepository(); } @Bean public MemberRepository memberRepository2() { return new MemoryMemberRepository(); } } MemberRepository의 구현체로 MemoryMemberRepository가 있다. MemberRepository 타입으로 스프링 빈을 조회해보자. ac.getBean(MemberRepository.cla..
스프링으로 전환 AppConfig @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } @Bean public DiscountPolicy discountPoli..
플러시(flush()) 플러시는 영속성 컨텍스트의 변경 내용을 DB에 반영한다. 절대 보관된 엔티티를 지우는 작업이 아니라 DB에 동기화하는 동작이다. 플러시 실행시 동작 1. 변경 감지가 동작하여 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해 수정된 엔티티를 찾는다. 2. 수정된 엔티티는 수정 쿼리를 만들어 쓰지 지연 SQL 저장소에 저장한다. 3. 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송한다. (등록, 수정, 삭제 쿼리) 플러시 방법 1. em.flush()를 직접 호출 2. 트랜잭션 커밋 시 플러시 자동 호출 3. JPQL 쿼리 실행 시 플러시 자동 호출 DB에 변경 내용을 SQL로 보내지 않고 트랜잭션 커밋만하면 DB에 반영되지 않는다. 그래서 트랜잭션이 종료하기전에 JPA는 플러시를..
IoC (Inversion of Control) - 제어의 역전 관심사의 분리 전 기존 학습시 MemberRepository 인터페이스에 구현체로 MemoryMemberRepository가 올 수 있고 다른 DB Repository를 연결할 수 있었다. 이때 클라이언트 구현 객체인 Service에서 직접 구현 객체를 생성하고, 연결, 실행을 다 했다... 즉, 구현 객체가 프로그램의 제어 흐름을 스스로 직접 조종했다. private final MemberRepository memberRepository = new MemoryMemberRepository(); 관심사의 분리 후 AppConfig를 통해 이제 구현 객체들인 MemberService, OrderService는 필요한 인터페이스들을 호출하지만 ..
Entity ManagerFactory, Entity Manager 1. 엔티티 매니저 팩토리의 생성 비용은 매우 크므로 하나만 만들어 애플리케이션 전체에서 공유한다. 2. 엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하며 다른 스레드간에 공유가 가능하다, 3. 엔티티 매니저는 동시에 접근하면 동시성 문제가 발생하므로 스레드가 공유가 불가능하다. 4. 엔티티 매니저는 DB 연결이 꼭 필요한 시점까지 커넥션을 얻지 않는다. 보통 트랜잭션 시작할때 획득한다. 영속성 컨텍스트 '엔티티를 영구 저장하는 환경'이라는 뜻이다. 여러 엔티티 매니저가 같은 영속성 컨텍스트에 접근할 수 있지만 현재는 하나에 하나의 영속성 컨텍스트가 생긴다고 알자. 엔티티의 생명주기 1. 비영속: 영속성 컨텍스트와 전혀 관계..