[인프런 워밍업 클럽 1기] BE 3주차 발자국

[인프런 워밍업 클럽 1기] BE 3주차 발자국

세 번째 걸음

인프런 워밍업 클럽 1기 BE에서 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지] 강의를 수강하며 작성하였다.

 

 

강의 학습

스프링 컨테이너

다른 DB를 사용할 때, Repository의 역할을 수정하면 이를 호출하는 Service의 코드까지 수정해야 한다.

스프링 컨테이너는 Service를 인스턴스화하고, 필요한 Repository를 알아서 결정해 준다.

컨테이너가 구현체를 알아서 결정해 주는 방식을 제어의 역전(IoC)라고 한다.

컨테이너가 선택해 클래스에 넣어 주는 과정을 의존성 주입(DI)라고 한다.

Repository가 여러 개일 경우, @Primary를 붙여 우선순위를 부여해 준다.

 

Spring Data JPA

SQL을 직접 작성하지 않고 객체와 관계형 DB를 짝지어 자동으로 쿼리를 날리는 방법

DB 테이블에 대응되는 Entity Class

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

@Column(nullable = false, length = 20, name = "name")
private String name;

@Id를 입력하면 Primary Key로 간주된다.

@GeneratedValue(strategy = GenerationType.IDENTITY)는 AUTO_INCREMENT와 같다.

@Column을 이용해 객체와 DB의 이름을 매핑하고, Null 여부와 문자열 길이 제한 등을 설정한다.

protected User() {}

JPA를 사용하기 위해 기본 생성자가 꼭 필요하다.

JPA를 활용한 Service

public void saveUser(UserCreateRequest request) {
    userRepository.save(new User(request.getName(), request.getAge()));
}

public List<UserResponse> getUsers() {
    return userRepository.findAll().stream()
            .map(UserResponse::new)
            .collect(Collectors.toList());
}

save()에 객체를 넣어주면 INSERT SQL이 자동으로 날아간다.

findAll()은 SELECT * FROM user와 같이 모든 데이터를 가져온다.

그 외에 By 구절을 통해 자동으로 SQL 쿼리를 날릴 수 있다.

 

 

과제 수행

6일차 과제 : Controller 3단 분리하기

API와 HTTP 관련 역할은 Controller 코드에서,

분기 처리와 로직 담당은 Service 코드에서,

DB와의 접근 담당은 Repository 코드에서 각자의 역할만 수행하도록 분리하였다.

Repository를 Interface로 만들어 다양한 DB 연결 방식이 필요할 때 구현하여 활용할 수 있다.

 

7일차 과제 : JPA 적용하기

Entity 코드를 작성해 DB와 객체를 짝짓고, 예외 처리 로직을 작성한다.

save, upodate, countBy~, findBy~를 통해 SQL을 직접 작성하지 않고 쿼리를 전송한다.

Repository를 Interface로 만들어 Service에서 구현하여 사용하였다.

 

 

느낀 점

JPA를 사용하니 길었던 Repository 코드가 몇 줄로 줄어들었고, SQL을 직접 작성하지 않아도 되어 편리했다. Controller - Service - Repository의 3단 구조와 함께 Entity, DTO를 사용하여 각 클래스가 자신의 역할만 맡아 수행할 수 있도록 구현하였는데 코드를 작성하는 것뿐만 아니라 보고 읽었을 때 이해가 쉬웠다.

댓글을 작성해보세요.

채널톡 아이콘