(spring)첫 흔적

전성영·2022년 5월 20일
0

spring

목록 보기
3/31

spring 에 대해서 공부를 시작했다. 좋은 팀원들과 강의가 있어서 마음의 위안을 삼고 열심히 해보려고 한다.

이번 포스팅에서는 각 에노테이션의 사용법Lombok, api, DTO, ARC 등 을 정리하려고 한다.

사용하는 RDBMS는 H2이다. 서버가 작동을 멈추면 데이터가 모두 삭제되지만 가벼워서 좋다.

H2 설정부터 해주자.

spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb

application.properties에 추가
첫 번째 줄은 웹 콘솔을 보이게 해주는 것이고, database를 H2 쓸 것이라고 알려주는 것이다.

접속 방법
localhost:8080/h2-console 로 들어가준다.

여기서 알아야 할 것.
쿼리를 일일이 짤 줄 알아야 하지만 여기선 JPA를 사용 할 것이다.

JPA란?

JPA는 자바 진영에서 DB 테이블과 자바 객체 사이의 매핑을 처리해주는 ORM(Object-relational mapping)이라는 기술의 표준이다.
즉 자바의 클래스와 DB의 테이블을 매핑하는 기술이라고 보면 될 것 같다.

보통 JDBC를 사용하면 테이블 수정을 할 때 관련되어있는 모든 쿼리를 수정해야 하는데 JPA는 매핑설정만 변경하면 되서 유지보수가 쉽다.

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

.gradle에 한 줄을 추가하면 끝~~



시작하기에 앞서 "테이블"은 Domain, "SQL"은 Repository 이라고 생각하면 편하다. Service는 주요 기능???? 내 생각

domain pakage안에 있는 Course.java의 일부이다.
신기한 에노테이션들이 많이 보이는데 Lombok으로 인해 @Getter@Setter 로 getter&setter를 대체할 수 있다. Lombok형님

그 외에 @Id 는 Id값 , Primary Key로 사용하겠다는 뜻이고,

 @GeneratedValue(strategy = GenerationType.AUTO) 

이 친구는 자동으로 값이 증가되게 해주는 친구이다!

선택적 속성으로 generator와 strategy가 있는데,
strategy는 persistence provider가 엔티티의 주키를 생성할 때 사용해야 하는 주키생성 전략을 의미한다. 디폴트 값은 AUTO이다.
generator는 SequenceGenerator나 TableGenerator 애노테이션에서 명시된 주키 생성자를 재사용할 때 쓰인다. 디폴트 값은 공백문자("")이다.

JPA - REPO

다음은 CourseRepository.java 인터페이스 이다. 이 친구도 domain pakage 안에 들어가있다.
이게 전부다. 진짜진짜.
JpaRepository를 상속받고 <> 안에 들어가는 정보는 <클래스 이름, ID 자료형>
이다.

상속 후 적용

또 신기했던 것은 domain 밑에 Timestamped.java이다.

@MappedSuperclass - 상속했을 때 컬럼으로 인식하게 해주는 에노테이션이다. 착한친구

@EntityListeners 는 엔티티를 DB에 적용하기 전, 이후에 커스텀 콜백을 요청할 수 있는 어노테이션이다.

그리고 abstract 를 붙여줌으로서 상속 외엔 사용하지 못하게 한 것이다.

@EntityListeners 의 인자로 커스텀 콜백을 요청할 클래스를 지정해주면 되는데, Auditing 을 수행할 때는 JPA 에서 제공하는 AuditingEntityListener.class 를 인자로 넘기면 된다.

그 밑에는 생성일자를 나타내는 @CreatedDate 과 마지막 수정일자를 나타내는 @LastModifiedDate가 있다.

그 후Course.java에 Timestamped를 상속시켜준다.

또 Main.java에 가서 @EnableJpaAuditing를 붙여줘야 적용이 된다.

Audit은 감시한다 라는 뜻으로 Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능이다.

도메인을 영속성 컨텍스트에 저장하거나 조회를 수행한 후에 update를 하는 경우 매번 시간 데이터를 입력하여 주어야 하는데, audit을 이용하면 자동으로 시간을 매핑하여 데이터베이스의 테이블에 넣어주게 된다.

자 이제 저장조회를 해보자.

저장/ 조회

저장

courseRepository.save(new Course("프론트엔드의 꽃, 리액트", "임민영"));

JPA를 상속받은 Repo를 적은 후 . 을 써주면 JPA가 제공하는 함수들을 사용할 수 있는데 그 중 저장하는 기능인 .save() 이다.

이럼 저장 끝~~~

조회

Course course = repository.findById(1L).orElseThrow(
() -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")

findById안에 1L은 ID값이 1인 Long type 이라는 뜻이고,
orElseThrow는 만약 ID값이 1인 친구가 없으면 예외처리를 시키는 것이다.

 List<Course> courseList = courseRepository.findAll();
 for (int i = 0; i < courseList.size(); i++) {
     Course course = courseList.get(i);
     System.out.println(course.getId());
     System.out.println(course.getTitle());
     System.out.println(course.getTutor());
 }

.findAll() 은 말 그대로 전체출력이다.

Update는 Service가 담당한다.

  1. Course.java에 업데이트 된 값이 적용되야 하기 때문에
public void update(Course course) {
this.title = course.title;
this.tutor = course.tutor;
}
  1. service 패키기 생성 후 CourseService.java 생성

@Service를 통해 서비스임을 명시 해준 후
@RequiredArgsConstructor 이 친구로 final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 만들어준다. Lombok gooood

그래서 private final CourseRepository courseRepository; 이 친구한테 final을 붙여준 것이다.

그렇지 않으면 아래의 코드를 써줘야 한다.

public CourseService(CourseRepository courseRepository) {
	this.courseRepository = courseRepository;
}

생성자를 통해, Service 클래스를 만들 때 꼭 Repository를 넣어주도록
스프링에게 알려주는 코드이다.

@Transactional 이 친구는 sql쿼리가 일어나야 되는것을 스프링에게 알려주는 친구이다.

자 이제 Update를 사용해보자.

CourseRequestDto requestDto = new CourseRequestDto("웹개발의 봄, Spring", "임민영");
courseService.update(1L, requestDto);

update의 파라미터인 ID값과 requestDto 를 넣어준다.
이럼 업데이트 끝!!

자 이제 DTO 친구를 알아보자

DTO란?

read, update할 때 클래스를 직접 만자면서 돌아다니는데 위험하다.
그래서 그걸 극복하기 위해 DTO(Data Transfer Object)를 사용한다.

domain 밑에 CourseRequestDto.java를 만든 후

@Getter, @Setter 에노테이션은 아까 말씀드렸고, @NoArgsConstructor 이 친구는 빈 생성자를 만들어 주는 친구이다.

이렇게 만들어주고 DTO를 상황에 맞게 사용하고 전 코드를 변경시켜주면 된다.

이번 글은 내가 까먹지 않게 다시 한번 복기??해보는 목적이었다.
처음 보는 사람들은 모를텐데 앞으로는 훨씬 가독성있고 순서에 맞게 써보려고 노력해야겠다. 끝!

profile
Slow and Steady

0개의 댓글