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

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

첫 걸음

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

강의 학습

HTTP와 API

HTTP란 다른 컴퓨터로 데이터를 보내기 위한 데이터 표준이다.
API는 정해진 약속에 따라 특정 기능을 수행하는 코드이다.

 

HTTP Method 중 하나인 GET은 쿼리를 통해 정보를 보낸 후 데이터를 요청한다.
/add?number1=10&number2=20 

Controller는 API가 실행되는 입구와 같다.

@GetMapping("/add")
public int addTwoNumbers(@RequestParam int number1, @RequestParam int number2) {
    return number1 + number2;
}

 

GET 방식에서 매개변수를 각각 하나씩 입력받을 때에는 @RequestParam을 사용하여 변수에 쿼리의 값을 넣는다.
만약 매개변수가 많을 경우, DTO 객체로 만들어 관리한다.

@Getter
public class CalculatorAddRequest {
    private final int number1;
    private final int number2;

    public CalculatorAddRequest(int number1, int number2) {
        this.number1 = number1;
        this.number2 = number2;
    }
}

GET 방식의 DTO 객체는 반드시 생성자를 포함해야 한다.

 

DTO 객체를 이용한 Controller는 다음과 같다.

@GetMapping("/add")
public int addTwoNumbers(CalculatorAddRequest request) {
    return request.getNumber1() + request.getNumber2();
}

DTO를 이용할 때는 @RequestParam을 제거해야 하며 변수를 객체로 감싸 불러오기 때문에 getter를 사용해야 한다.

 

마찬가지로 HTTP Method인 POST는 Body를 통해 정보를 보낸다.
객체 표기법인 JSON을 사용하고, List를 사용하거나 JSON 안에 JSON을 사용하는 것도 가능하다.

POST 방식에서 DTO를 이용한 Controller는 다음과 같다.

@PostMapping("/multiply")
public int multiplyTwoNumbers(@RequestBody CalculatorMultiplyRequest request) {
    return request.getNumber1() * request.getNumber2();
}

@RequestBody를 사용하여 HTTP Body로 들어오는 JSON을 DTO 객체 형태로 변환한다.

GET 요청의 @RequestParam과는 달리 DTO 객체를 사용해도 Annotaion을 생략할 수 없다.

 

GET 요청과 달리 POST 요청은 생성자가 필요하지 않다.

 

Domain(Entity)와 DTO의 차이

DTO는 계층 간 데이터 교환을 위해 사용된다.
반면, Domain은 DB 테이블과 매핑되어 데이터를 저장하거나 관리하는 실제 비즈니스 도메인을 표현한다.
DTO는 단순히 어떤 데이터로 통신할 것인지 정의하고, 상세한 정의는 Domain에서 한다.

 

Spring에서 Database 사용하기

private final JdbcTemplate jdbcTemplate;

public UserController(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}

@PostMapping("/user")
public void saveUser(@RequestBody UserCreateRequest request) {
    String sql = "insert into user (name, age) values (?, ?)";
    jdbcTemplate.update(sql, request.getName(), request.getAge());
}

JdbcTemplate를 이용하면 Spring에 SQL을 전달할 수 있다.
SQL문을 작성하여 문자열 변수로 저장하는데, 값이 들어갈 부분에 ?를 사용하면 데이터를 넣을 수 있다.

 

 

과제 수행

1일차 과제 : JAVA Annotation

어노테이션은 실제 데이터가 아닌 메타데이터로써 클래스와 메서드에 추가하여 다양한 기능을 부여한다.
반복적인 코드 작성을 줄일 수 있어 코드량이 감소하고, 코드의 역할을 명확히 지정할 수 있어 유지보수가 용이하다는 장점이 있다.
사용자가 원하는 기능을 수행하는 커스텀 어노테이션을 만드는 방법도 알아보았다.

 

2일차 과제 : GET & POST API

날짜를 받는 API를 구현할 때, String으로 날짜를 받은 후 LocalDate로 변환하는 과정을 거쳤다.
그러나, 스프링 부트 2버전에서는 @DateTimeFormat을 사용해 LocalDate를 바로 받을 수 있다고 한다.
3버전대에서는 어노테이션 없이 LocalDate를 바로 받을 수 있다.

 

3일차 과제 : 람다식과 익명 클래스

익명 클래스란 이미 정의되어 있는 부모 클래스의 자원을 일회성으로 재정의한 클래스이며, 자식 클래스를 정의할 필요 없이 객체화가 가능하다.
람다란 자바의 인터페이스를 익명 클래스로 구현한 익명 구현 객체를 짧게 표현한 것이다. 메서드 타입과 이름, 매개변수 타입, 중괄호, return문을 생략하고 화살표 기호를 넣는다.

 

4일차 과제 : 과일 가게 API 만들기

enum 타입을 통해 과일의 판매 여부를 ‘SOLD’, ‘NOT_SOLD’의 두 가지 상태로 구분하였다.
COALESCE()를 사용하여 팔린 과일 혹은 팔리지 않은 과일이 존재하지 않을 경우, NULL이 아닌 0으로 표시되도록 하였다.
쿼리의 결과가 하나이므로 queryForObject를 이용해 SQL의 결과를 직접 long 타입의 객체로 매핑하였다.

 

 

느낀 점

Spring의 기초를 복습하면서 ‘이건 왜 이렇게 쓰일까’와 같은 질문을 던지며 천천히 학습할 수 있었다.

특히, 인프런의 각 강의에 있는 질문 게시판을 활용하였다.
강의를 들으며 의문이 든 부분들은 이미 선배 러너들이 질문을 했고, 강의자 분께서 자세하게 답변을 달아 주셨기 때문에 편하게 학습할 수 있었다.

 

매일 과제가 있지만 하루에 학습할 양을 안내해 주는 진도표가 존재하고, 하루치 공부 양이 그렇게 많지 않았기 때문에 오히려 꾸준하게 하루 공부를 진행할 수 있어 좋았다.

일주일을 돌아보며 작성하는 발자국은 그동안 배운 내용을 정리하고, 느낀 점을 회고할 수 있어 좋은 방법인 것 같다.
강의를 들으며 개조식으로 정리한 내용을 글로 풀어 쓰니 내가 얼만큼 이해하고 있는지 확인할 수도 있다.

댓글을 작성해보세요.