deVelop
@Transactional과 전파
Spring/JPA 2023. 8. 19. 23:44

✏️ 스프링에서 AOP를 이용하여 사용하는 선언적 트랜잭션 방식인 @Transactional과 Propagation을 알아보자 트랜잭션의 전파 (Propagation) 문제 상황 A라는 트랜잭션이 시작되고 트랜잭션 A가 끝나지 않은 시점에서 트랜잭션 B 메소드가 호출된다고 가정하자. B는 어느 트랜잭션에서 동작할까? 이때 A라는 트랜잭션과 B 트랜잭션은 서로 다른 Service 레이어에 존재하는 메소드로 가정한다. REQUIRED (default) A 메소드 - @Transactional(propagation = Propagation.*REQUIRED*) B 메소드 - @Transactional(propagation = Propagation.*REQUIRED*) 이미 진행중인 트랜잭션이 없으면 새로 시작..

article thumbnail
스프링 / 다형성 / 객체 지향 설계

스프링 부트 스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용 Tomcat같은 웹 서버를 내장O → 별도의 웹 서버 설치x 스프링과 3rd parth(외부)라이브러리 자동 구성 메트릭 모니터, 상태확인, 외부 구성 같은 프로덕션 준비 기능 제공 스프링 스프링이라는 단어는 문맥에 따라 다르게 사용! 스프링 DI 컨테이너 기술(의존성 주입) 스프링 프레임워크 스프링 부트, 스프링 프레임워크 등을 모두 포함한 스프링 생태계 자체 스프링의 핵심 스프링은 객체 지향 언어(자바)가 가진 강력한 특징을 살려내는 프레임워크 → 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임 워크 객체지향의 특징 추상화 캡슐화 상속 다형성 다형성 : 역할과 구현으로 구분 단순, 유연, 변경용이 장점 내부 ..

article thumbnail
[JPA] - 프록시(Proxy)와 지연로딩
Spring/JPA 2022. 6. 27. 20:33

프록시 public void printUserAndTeam(String memberId){ Member member= em.find(Member.class, memberId); System.out.println("회원 이름:" + member.getUserName()); System.out.println("소속 팀 이름:" + member.getteam().getName()); } public void printUser(String memberId){ Member member= em.find(Member.class, memberId); System.out.println("회원 이름:" + member.getUserName()); } 회원정보만 출력하는 비즈니스 로직은 member 엔티티만 사용하므로 me..

article thumbnail
[인프런] 실전!스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 | section7. 웹 계층 개발

컨트롤러 homeController @Controller @Slf4j public class HomeController { @RequestMapping("/") public String home(){ log.info("home Controller"); return "home"; } } @slf4j → Lombok이 지원하는 라이브러리로 logger를 자동으로 만들어줘서 log를 바로 찍어섯 사용가능. MemberController @Controller @Slf4j @RequiredArgsConstructor public class MemberController { private final MemberService memberService; @GetMapping(value="/members/new") pu..

article thumbnail
[인프런] 실전!스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 | section6. 주문 도메인 개발

1. OrderItem Entity @Entity @Getter @Setter @Table(name ="order_item") 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; //주문 수량 //=..

article thumbnail
[인프런] 실전!스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 | section5. 상품 도메인 개발

1. Item entity @Entity @Getter @Setter @Inheritance(strategy = InheritanceType.SINGLE_TABLE) //부모클래스에서 Inheritance 전략 작성해줘야 함. @DiscriminatorColumn(name = "dtype") //상속하는 부모 클래스에서 작성. public abstract class Item { @Id @GeneratedValue @Column(name ="item_id") private Long id; private String name; private int price; private int stockQuantity; @ManyToMany(mappedBy = "items") private List categories ..

article thumbnail
[인프런] 실전!스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 | section4. 회원 도메인 개발

1. MemberRepository @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 findAll(){ return em.createQuery("select m from Member m", Member.class).getResultList(); } //이름으로 회원 조회 public List fin..

article thumbnail
[인프런] 실전!스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 | section3. 애플리케이션 구현 준비

+Controller에서 Repository로 바로 접근할 수 있는 구조로( 간단한거에 한해서. 단, 단방향 이여야 함.) 계층형 구조 1. Controller , web: 웹 계층 2. Service : 비즈니스 로직, 트랜잭션 처리 3. repository: JPA를 직접 사용하는 계층, 엔티티 매니저 사용. 4. domain : 엔티티가 모여있는 계층. 모든 계층에서 사용.