Spring Boot RestAPI

HTTP GET Method

Lombok

Lombok cannot find symbol 에러

  • Enable annotation processing 체크

JPA

RDB 데이터베이스의 정보를 객체지향으로 손쉽게 활용할 수 있도록 도와주는 도구
Object(자바 객체)와 Relation(관계형 데이터베이스) 간의 맵핑을 통해서 보다 손쉽게 적용할 수 있는 기술을 제공

Entity

Java 변수를 선언할 때 CamelCase로 선언 ex) phoneNumber, createdAt
DB 컬럼에 SnakeCase 사용 ex) phone_number, created_at

JPA에서는 테이블을 자동으로 생성해주는 기능 존재
@Entity : 해당 클래스가 Entity임을 명시
@Table : 실제 DB테이블의 이름을 명시
@Id : Index primary key를 명시
@Column : 실제 DB Column의 이름을 명시
@GeneratedValue : Primary key 식별키의 전략 설정

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity // == table
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}

@AllArgsConstructor : 모든 필드에 대한 생성자를 자동으로 생성
@NoArgsConstructor : 파라미터가 없는 생성자를 생성

Jpa의 Entity 및 column은 자동으로 camel case -> DB의 snake_case에 매칭

Repository

따로 쿼리문을 작성하지 않아도 기본적인 CRUD

Entity를 통해 데이터를 DB에 저장

CRUD 작성

  • ex)
public class UserRepositoryTest extends StudyApplicationTests {

    // DI = Dependency Injection 의존성 주입
    @Autowired
    private UserRepository userRepository;

    @Test
    public void create(){
        // String sql = insert into user (%s, %s, %d) value (account, email, age);
        User user = new User();

        user.setAccount("TestUser03");
        user.setEmail("TestUser03@gmail.com");
        user.setPhoneNumber("010-1111-3333");
        user.setCreatedAt(LocalDateTime.now());
        user.setCreatedBy("admin3");

        User newUser = userRepository.save(user);
        System.out.println("newUser : " + newUser);
    }

    @Test
    @Transactional
    public void read(){
        Optional<User> user = userRepository.findByAccount("TestUser03");

        user.ifPresent(selectUser -> {

            selectUser.getOrderDetailList().stream().forEach(detail -> {
                Item item = detail.getItem();
                System.out.println(item);
            });
        });
    }

    @Test
    public void update(){
        Optional<User> user = userRepository.findById(2L);

        user.ifPresent(selectUser -> {
            selectUser.setAccount("PPPP");
            selectUser.setUpdatedAt(LocalDateTime.now());
            selectUser.setUpdatedBy("update method()");

            userRepository.save(selectUser);
        });

    }

    @Test
    @Transactional  // Rollback
    public void delete(){
        Optional<User> user = userRepository.findById(1L);

        Assertions.assertTrue(user.isPresent());  // true

        user.ifPresent(selectUser -> {
            userRepository.delete(selectUser);
        });

        Optional<User> deleteUser = userRepository.findById(1L);

        Assertions.assertFalse(deleteUser.isPresent()); // false
    }
}

@Autowired : 의존성 주입
@Transactional : 실행된 후 다시 Rollback

ifPresent() : 값이 존재하면 실행

JPA 연관관계 설정

@OneToOne - 일대일
@OneToMany - 일대다
@ManyToOne - 다대일
@ManyToMany - 다대다

OneToMany 사용

@OneToMany(fetch = FetchType.LAZY, mappedBy = "item")
    private List<OrderDetail> orderDetailList;
  • fetchType에는 LAZY(지연로딩), EAGER(즉시로딩)
    LAZY - 변수에 대해서 getMethod 호출을 하지 않는 이상 연관관계가 설정된 테이블에서 SELECT X
    EAGER - 연관관계가 설정된 모든 테이블에서 조인을 함. 성능 저하 위험 -> 1:1관계에서 보통 사용

ManyToOne 사용

// N : 1
    @ManyToOne
    private Item item;  // item_id

양방향 연관관계시 순환 참조 문제 -> ToString의 exclude를 통해 해결

@ToString(exclude = {"user", "item"})

스트림(Stream)

일관성 있는 연산으로 자료의 처리를 쉽고 간단하게 함
대상과 관계없이 동일한 연산을 수행

0개의 댓글