✏️ 스프링에서 AOP를 이용하여 사용하는 선언적 트랜잭션 방식인 @Transactional과 Propagation을 알아보자 트랜잭션의 전파 (Propagation) 문제 상황 A라는 트랜잭션이 시작되고 트랜잭션 A가 끝나지 않은 시점에서 트랜잭션 B 메소드가 호출된다고 가정하자. B는 어느 트랜잭션에서 동작할까? 이때 A라는 트랜잭션과 B 트랜잭션은 서로 다른 Service 레이어에 존재하는 메소드로 가정한다. REQUIRED (default) A 메소드 - @Transactional(propagation = Propagation.*REQUIRED*) B 메소드 - @Transactional(propagation = Propagation.*REQUIRED*) 이미 진행중인 트랜잭션이 없으면 새로 시작..
스프링 부트 스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용 Tomcat같은 웹 서버를 내장O → 별도의 웹 서버 설치x 스프링과 3rd parth(외부)라이브러리 자동 구성 메트릭 모니터, 상태확인, 외부 구성 같은 프로덕션 준비 기능 제공 스프링 스프링이라는 단어는 문맥에 따라 다르게 사용! 스프링 DI 컨테이너 기술(의존성 주입) 스프링 프레임워크 스프링 부트, 스프링 프레임워크 등을 모두 포함한 스프링 생태계 자체 스프링의 핵심 스프링은 객체 지향 언어(자바)가 가진 강력한 특징을 살려내는 프레임워크 → 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임 워크 객체지향의 특징 추상화 캡슐화 상속 다형성 다형성 : 역할과 구현으로 구분 단순, 유연, 변경용이 장점 내부 ..
프록시 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..
컨트롤러 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..
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; //주문 수량 //=..
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 ..
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..
+Controller에서 Repository로 바로 접근할 수 있는 구조로( 간단한거에 한해서. 단, 단방향 이여야 함.) 계층형 구조 1. Controller , web: 웹 계층 2. Service : 비즈니스 로직, 트랜잭션 처리 3. repository: JPA를 직접 사용하는 계층, 엔티티 매니저 사용. 4. domain : 엔티티가 모여있는 계층. 모든 계층에서 사용.