일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- Loss Function
- google login
- google cloud
- oauth
- AWS
- 커스텀 데이터 학습
- 양방향 매핑
- pandas
- @Transactional
- OG tag
- C++
- matplotlib
- YOLOv5
- idToken
- marksense.ai
- yolo
- html
- google 로그인
- javascript
- Spring
- 순환참조
- skt fellowship 3기
- 2021 제9회 문화공공데이터 활용경진대회
- Spring Boot
- JPA
- Expo
- 코드업
- STT
- react native
- 졸프
- Today
- Total
민팽로그
웹 개발의 봄, spring - 2주차 본문
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쿼리도 잘 알아야 함
'🍃spring boot > 웹 개발의 봄, spring' 카테고리의 다른 글
웹 개발의 봄, Spring - 5주차 (2) (0) | 2021.08.14 |
---|---|
웹 개발의 봄, Spring - 5주차 (1) (0) | 2021.08.12 |
웹 개발의 봄, spring - 1주차 (0) | 2021.07.30 |