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

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

강의 수강,과제 수행하면서 생겼던 궁금증을 해결하는 과정을 위주로 블로그 글을 작성하려고 합니다.

 

강의 수강

 

1일차 - OT 인프런 워밍업 클럽 스터디 및 일정 소개

 

코치님과 구글 밋을 통해 온라인 OT를 진행하였습니다.

간단한 스터디 과정 및 일정에 대해 소개 해줬고, 코치님이 이거까지 알아야하나? 라는 주제로 의견을 공유해주셨습니다.

 

2일차 - 서버 개발을 위한 환경 설정 및 네트워크 기초 (1강 ~ 5강)

2일차에는 서버, 네트워크, HTTP, API를 배웠다.
API가 무엇인지 잘 몰랐는데 Input을 주면 OutPut이 나오는 함수와 비슷하다는걸 알게 되었다.
API가 무엇인지 와닿지 않았는데 감을 잡을 수 있었다

3일차 - 첫 HTTP API 개발 (6강 ~ 10강)

GET API와 POST API를 개발해봤다.
GET 요청은 쿼리를 통해서 요청을 주고 POST 요청은 body를 통해 요청을 주는데
@RequestParam을 통해 주어지는 쿼리를 함수 파라미터에 넣는다.
파라미터 대신에 DTO 객체를 넣어서 쿼리를 받을 수 있다

public class CalculatorAddRequest{

    private final int number1;
    private final int number2;

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

 

post 요청은 body로 들어오는 JSON을 DTO로 바꿔주기 위해 @RequestBody를 사용해야하는데
@RequestBody를 사용하면 DTO 객체에 생성자를 만들지 않아도 괜찮은데 이 이유가 궁금했다

public class CalculatorMultiplyRequest {
    private int number1;
    private int number2;
   
    public int getNUmber1(){
    return number1
    } 

    public int getNumber2(){
    return number2;
    }
 }

다음과 같은 이유를 찾을 수 있었다.
Spring의 동작 방식: @RequestBody 어노테이션이 적용된 메서드 파라미터에는 HTTP 요청의 본문을 기반으로 객체가 생성됩니다. Spring은 이를 위해 클래스의 기본 생성자를 호출하여 빈 객체를 생성하고, 요청의 본문에서 추출한 데이터를 객체에 설정합니다.

4일차 - 기본적인 데이터베이스 사용법 (11강 ~ 13강)

 

MySQL의 사용법을 배웠다

DDL(데이터 정의어) - CREATE, ALTER, DROP

DML(데이터 조작어) - INSERT, UPDATE, SELECT, DELETE

이 2개를 사용해서 데이터를 DB에 생성, 조회, 갱신, 삭제하고

5일차 - 데이터베이스를 사용해 만드는 API (14강 ~ 16강)

이 강의를 통해 사람이 직접 DB에 접속해서 DB를 조작하는게 아닌

Spring 서버가 MySQL DB에 접근해서 DB를 조작하게 API를 만들었다.

 

6일차 - 클린코드의 개념과 첫 리팩토링(17강~ 18강)

 

이 강의를 통해 저번 강의를 통해 만든 컨트롤러 클래스를 3개의 클래스로 쪼개 보았다.

Controller 클래스 - API의 진입 지점으로써 HTTP Body를 객체로 변환

Service 클래스 - 분기처리 로직

Repository 클래스 - SQL을 사용해 실제 DB와의 통신을 담당

 

컨트롤러 클래스 작성 시 JdbcTemplate 객체를 생성하는데 new 키워드를 사용하지 않고 생성했다
이게 어떻게 가능한지 궁금해서 찾아보니


스프링에서는 보통 dependency injection을 사용하여 객체를 주입합니다. 이 코드에서도 JdbcTemplate jdbcTemplate는 생성자를 통해 주입됩니다.

생성자 public UserController(JdbcTemplate jdbcTemplate)에서 JdbcTemplate 객체가 주입됩니다. Spring이 UserController를 생성할 때, 필요한 JdbcTemplate 객체를 찾아서 자동으로 주입해줍니다. 이것이 Spring의 IoC (Inversion of Control) 컨셉입니다.

따라서 new 키워드를 사용하여 직접 객체를 생성할 필요가 없고, Spring이 해당 객체를 관리하고 주입해줍니다.

미션

1일차

image

어노테이션을 미리 정의 해두면 @RequestParam 같은 한 단어만 작성해주면 스프링이 알아서 GET 요청의 쿼리를 메서드의 파라미터로 바꿔준다.

어노테이션은 이런 마법 같은 일을 해준다.

 

 

2일차

문제1

image

Controller에서 getter 메서드가 있는 객체를 반환하면 반환 값이 JSON으로 반환 한다!

 

CalculatorResponse.java


public class CalculatorResponse {

    private int add;
    private int minus;
    private int multiply;

    public CalculatorResponse(int num1, int num2) {
        this.add = num1 + num2;
        this.minus = num1 - num2;
        this.multiply = num1 * num2;
    }

    public int getAdd() {
        return add;
    }

    public int getMinus() {
        return minus;
    }

    public int getMultiply() {
        return multiply;
    }
}

 

ExController.java

@RestController
public class ExController {

    @GetMapping("/api/v1/calc")
    public CalculatorResponse plusMinusMultiplyCalculator(@RequestParam int num1, int num2) {

        return new CalculatorResponse(num1, num2);
		    }
    }

 

Response

image

문제2

image

ExController.java

@RestController
public class ExController {

@GetMapping("/api/v1/day-of-the-week")
    public DateResponse dayOfTheWeek(@RequestParam String date) {

        return new DateResponse(date);

	    }
	}

 

DataResponse.java


public class DateResponse {
    private Enum<DayOfWeek> dayOfTheWeek;

    public DateResponse(String date) {
        LocalDate parsed = LocalDate.parse(date);
        this.dayOfTheWeek = parsed.getDayOfWeek();
    }

    public Enum<DayOfWeek> getDayOfTheWeek() {
        return dayOfTheWeek;
    }
}

 

GET 메서드에서 파라미터의 value의 타입은 문자열로 들어오므로 DateResponse의 생성자에서 LocalDate.parse()를 통해 문자열을 LocalDate로 바꿔주었다.

 

image

문제3

image

ExController.java

@RestController
public class ExController {

@PostMapping("/api/v1/multi-number-sum")
    public int multiNumberSum(@RequestBody CalculatorMultiNumber request) {
        int[] numbers = request.getNumbers();
        int sum = Arrays.stream(numbers).sum();
        return sum;
	    }
    }

 

CalculatorMultiNumber.java

public class CalculatorMultiNumber {

    int[] numbers = new int[5];

    public int[] getNumbers() {
        return numbers;
    }
}

Response

image

Response
image

크기가 5개인 배열을 선언 하고 body에 길이가 6개를 리스트 넣고 요청해도 6개의 값을 반환한 값을 돌려준다.
왜 그런지 이유를 찾고 싶었는데 못찾았다 ㅠㅠ

 

3일차

image람다식은 익명 클래스를 좀 더 쉽게 쓸 수 있게 자바8부터 도입된 개념이다.
OOP인 자바는 람다식의 도입으로 함수형 프로그래밍도 가능해졌다

하루에 몰아서 적으려니까 너무 힘들었다 다음주 회고록은 따로 초고를 그날 그날 적어놔야겠다..

이 블로그에 올린 코드와 문제의 출처는

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%84%9C%EB%B2%84%EA%B0%9C%EB%B0%9C-%EC%98%AC%EC%9D%B8%EC%9B%90

입니다

 

 

댓글을 작성해보세요.