민팽로그

웹 개발의 봄, spring - 2주차 본문

🍃spring boot/웹 개발의 봄, spring

웹 개발의 봄, spring - 2주차

민팽 2021. 7. 30. 20:26
Client, Server, DB의 관계 도식화

-> 클라이언트에서 api 호출을 통해 서버에 데이터를 요청하면, 서버가 DB에서 필요한 데이터를 찾아 클라이언트로 반환해주는 구조

 

JPA 간단히 사용하기

build.gradle 파일의 dependencies에 implementation 'org.springframework.boot:spring-boot-starter-data-jpa'를 추가하여 JPA를 사용할 수 있음

 

@Getter
@Entity
@Table(name = "WRONGQUIZ")
@NoArgsConstructor
public class WrongQuiz {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long serialId;

    @ManyToOne
    @JoinColumn(name = "userId", nullable = false)
    private User userId;

    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "stageNum", referencedColumnName = "stageNum", nullable = false),
            @JoinColumn(name = "quizNum", referencedColumnName = "quizNum", nullable = false)
    })
    private GameOXQuiz gameOXQuiz;

    public WrongQuiz(WrongQuizRequestDto wrongQuizRequestDto) {
        this.userId = wrongQuizRequestDto.getUserId();
        this.gameOXQuiz = wrongQuizRequestDto.getGameOXQuiz();
    }
}

프로보노 프로젝트에서 작성한 간단한 코드를 가져왔다.

@Entity: 객체를 DB의 테이블과 매핑시키기 위한 어노테이션. 

@Table: 객체가 DB의 테이블로 매핑될 때 테이블 명을 지정할 수 있음. 따로 지정하지 않으면 클래스 명과 동일한 테이블이 만들어짐. 

Table 어노테이션은 findAll()등을 사용하여 테이블을 조회할 때 특정 컬럼만 조회하기 위해서 사용할 수도 있음.

-> @Table어노테이션에 매핑하고자 하는 테이블 명을 지정하고 조회하고자 하는 컬럼 명으로만 클래스를 구성하는 식? 안해봐서 정확하지않음. 나중에 해봐야 할듯!

@ManyToOne: 객체 참조 관계. 다대일관계임을 나타냄. 참조 객체의 기본키를 참조함

@JoinColumn: 참조 컬럼을 지정할 수 있음. 여러개 가능!

@Id: 기본키로 설정

@Column: 컬럼을 나타냄

 

public interface WrongQuizRepository extends JpaRepository<WrongQuiz, Long> {
    @Query(nativeQuery = true, value = "SELECT * FROM wrongquiz as w WHERE w.user_id IN (:name)")
    List<WrongQuiz> findByUserId(@Param("name") String name);

    List<WrongQuiz> findAllByUserId(String id);
}

JPA는 JpaRepository를 통해 DB에 접근할 수 있음. 튜플 저장을 위해서는 save함수 사용. 

@Query: sql문을 직접 작성하여 테이블 조회 가능

findByUserId는 개발자가 작성한 함수로, 클래스의 변수명을 참고하여 적절한 함수를 만들어서 사용할 수 있음. 쿼리 메소드 관련 자세한 내용은 아래 사이트 참고!

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods

 

Spring Data JPA - Reference Documentation

Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

 

@MappedSuperclass // 상속했을 때, 컬럼으로 인식하게 합니다.
@EntityListeners(AuditingEntityListener.class) // 생성/수정 시간을 자동으로 반영하도록 설정
public class Timestamped {

    @CreatedDate // 생성일자임을 나타냅니다.
    private LocalDateTime createdAt;

    @LastModifiedDate // 마지막 수정일자임을 나타냅니다.
    private LocalDateTime modifiedAt;
}

@EntityListeners, @CreatedDate, @LastModifiedData 어노테이션을 사용하여 작성한 위 클래스로, 이 클래스를 상속한 클래스는 컬럼으로 생성일자와 수정일자를 추가로 갖을 수 있음.

자동 생성을 위해 Application클래스에 @EnableJpaAuditing을 달아주어야함!

 

 

REST API

Method로는 POST, GET, PUT, DELETE가 있음.

서버가 실행중일 때 ARC(Advanced REST Client)같은 툴을 사용하면 api를 만든 후 기능을 테스트 할 수 있다.

 

RequestDTO(Data Transfer Object)

request를 받을 때, 앞 게시글에서 언급했던 Controller는 api를 통해 요청을 처리하기 위해 필요한 클래스이고, requestDTO는 테이블과 매핑되는 object를 request를 받는데에까지 막 사용하지 않도록 request 전용으로 사용하는 클래스이다.

 

service

DB에서 테이블 내용이 변경되는 등 중요한 작업, 비즈니스 처리가 일어나는 부분이다. 테이블 update함수 등이 작성된다.

 

느낀점

REST api가 되기 위해서는 관련 제약조건을 만족해야 한다. 대충은 알고있지만 따로 정리 필요!

JPA 공부 시 @Transactional 어노테이션이 뭔지 알기

JPA로 모든 BD 쿼리를 다룰 수는 없음 -> 백앤드 개발자는 DB쿼리도 잘 알아야 함

Comments