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

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

1강

spring.io ⇒ springboot 프로젝트 만들기

spring boot는 톰캣이 내장되어 있음 (Packaging - Jar)

2강 @SpringBootApplication과 서버

@ → 어노테이션

@SpringBootApplication ⇒ 자동으로 설정

서버란 ?

: 기능을 제공하는 것, 어떠한 기능을 제공하는 프로그램, 그 프로그램을 실행시키고 있는 컴퓨터

기능을 제공하기 위해서는 누군가의 요청이 있어야 한다.

3강 네트워크란 무엇인가?

각각의 PC에는 고유 IP 존재

IP를 모두 외우기 어렵기 때문에 도메인 이름을 사용 (ex - naver.com / spring.com ) ⇒ DNS (Domain Name System)

4강 HTTP와 API란 무엇인가?

데이터를 주고 받는 표준이 존재

HTTP (HyperText Transfer Protocol)

  • GET

  • POST

  • PUT

  • DELETE

API (Application Programming Interface)

: 클라이언트와 서버는 HTTP를 주고 받으며 기능을 동작하는데 이때 정해진 규칙을 API라고 한다.

URL (Uniform Resource Locator)

HTTP 응답 코드

  • 200

  • 300

  • 400

  • 500

5강 GET API 개발하고 테스트하기

@RestController

→ API의 진입지점 만들기

@RestController를 사용하면 API의 진입지점인것을 알수 있다.

6강 POST에서는 데이터를 어떻게 받을까 ?

HTTP Body를 이용!

image

image

10강 Database와 MySQL

컴퓨터의 핵심 부품

  • CPU : 연산

  • RAM : 임시 기억장치

  • DISK : 장기 기억장치

Database

RDB (Relational Database)

SQL (Structured Query Language)

MySQL 접근

  • intellij ultimate

  • CLI

    • mysql -u root -p

11강 MySQL에서 테이블 만들기 DDL (Data Definition Language)

데이터베이스 만들기

  • create database [데이터베이스 이름];

데이터베이스 목록보기

  • show databases;

데이터베이스 지우기

  • drop database [데이터베이스 이름];

데이터베이스 안으로 들어가기

  • use [데이터베이스 이름];

테이블 목록 확인하기

  • show tables;

테이블 만들기

  • create table [테이블 이름](

    [필드1 이름][타입][부가조건],

    [필드2 이름][타입][부가조건],

    primary key ([필드이름])

    );

create table fruit (id bigint auto_increment, name varchar(20), price int, stocked_date date, primary key (id));

테이블 제거하기

  • drop table [테이블 이름];

MySQL 타입

tinyint : 1바이트 정수

int : 4바이트 정수

bigint : 8바이트 정수 (21억건이상)

double : 8바이트 정수

decimal(A,B) : 소수점을 B개 가지고 있는 전체 A자릿수 실수

char(A) : A글자가 들어갈 수 있는 문자열

varchar(A) : 최대 A글자가 들어갈 수 있는 문자열

date : 날짜, yyyy-MM-dd

time : 시간, HH:mm:ss

datetime : 날짜와 시간을 합친 타입, yyyy-MM-dd HH:mm:ss

12강 DML (Data Manipulation Language)

CRUD

데이터 넣기

  • INSERT INTO [테이블 이름] (필드1이름, 필드2이름,…) VALUES (값1, 값2,…)

INSERT INTO fruit (name, price, stocked_date) values ('사과', 1000, '2023-05-01');

데이터 조회, 업데이트, 삭제

  • select * from [테이블명] where [조건]

  • update [테이블 이름] set 필드1이름 = 값, 필드2 이름 = 값,… where [조건]

  • delete From [테이블 이름] where [조건];

13강 Spring에서 Database 사용

spring 프로젝트 Resource폴더 아래에 application.yml 파일 생성

spring:
  datasource:
    url: "jdbc:mysql://localhost/library" //jdbc를 이용해 Mysql에 접근
    username : "root"
    password: ""
    driver-class-name: com.mysql.cj.jdbc.Driver

application.yml

 @GetMapping("/user")
    public List<UserResponse> getUsers() {

        String sql = "SELECT * FROM user";
        jdbcTemplate.query(sql, new RowMapper<UserResponse>() {
            @Override
            public UserResponse mapRow(ResultSet rs, int rowNum) throws SQLException {
                long id = rs.getLong("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                return new UserResponse(id, name, age);
            }
        });
    }

익명 클래스 사용 RowMapper

@GetMapping("/user")
    public List<UserResponse> getUsers() {

        String sql = "SELECT * FROM user";
        return jdbcTemplate.query(sql, (rs, rowNum) -> {
            long id = rs.getLong("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            return new UserResponse(id, name, age);
        });
    }

RowMapper에 option + enter ⇒ 람다식으로 변경

14강 ~ 16강

public void updateUser( UserUpdateRequest request) throws IllegalAccessException {
    boolean isUserNotExist = userRepository.isUserNotExist(request.getId());
    if(isUserNotExist){
        throw new IllegalAccessException();
    }
    userRepository.updateNameUser(request.getName(), request.getId());

}

public void deleteUser(String name)  throws IllegalAccessException {
    boolean isUserNameNotExist = userRepository.isUserNameNotExist(name);
    if(isUserNameNotExist){
        throw new IllegalAccessException();
    }
    userRepository.deleteUser(name);
}

수정, 삭제 전 사용자가 DB에 존재하는 데이터인지 확인하기 위해 예외처리를 해주었다.

jdbcTemplate.query ……. ⇒ List로 반환된다.

isEmpty()를 붙여 boolean 타입인지 확인하도록 한 후 조건문 실행

만약 존재 하지 않는 유저라면 IlleagalAccessException()이 호출된다.

PostMan으로 확인한 결과

image홍합이란 유저가 없어서 500이 떴다!

17강 좋은 코드란 무엇인가

  1. 코드는 요구사항을 표현하는 언어

    개발자는 요구사항을 구현하기 위해 코드를 읽고 작성한다.

     

    코드를 읽는 것은 필수적이고 피할 수 없다

    안좋은 코드가 쌓이면, 시간이 지날 수록 생산성이 낮아진다!

     

    Controller에서 모든 기능을 구현하면 왜 안될까?

    ⇒ 함수는 최대한 작게 만들고 한 가지 일만 수행하는 것이 좋다.

     

     

18강. Controller를 3단 분리하기 - Service와 Repository

기존 Controller의 함수 1개가 하고 있던 역할

  • API의 진입 지점으로써 HTTP Body를 객체로 변환하고 있다. ⇒ Controller

  • 현재 유저가 있는지, 없는지 등을 확인하고 예외 처리를 해준다. ⇒ Service

  • SQL을 사용해 실제 DB와의 통신을 담당한다. ⇒ Repository

Layered Architecture

Controller ← Service ← Repository


미션 & 일주일 회고

미션 (1 ~ 3번째 과제)

https://charm-vise-f40.notion.site/016b87f39bbe4c31991ab1c51632bd73

https://charm-vise-f40.notion.site/2-372b48a579674c988a990fa4b9a14ebb?pvs=4

https://charm-vise-f40.notion.site/3-212dca4aeb81494c9d63f66689b90e4f?pvs=4

워밍업 클럽이 벌써 시작한 지 일주일 정도가 흘렀다.

진도표에 맞춰 강의를 듣고 과제를 진행하다 보니 시간이 금방 흐른 느낌이다!!

강의를 보다 보면 내가 다 아는 것 같은 느낌이 들었는데 역시 과제를 하면 내가 어느 정도 까지 이해했는지 알수있었다 ㅎㅎ

두 번째 과제를 할 때에는 출력값이 JSON으로 문제에는 나와 있지만 처음에 무작정 하다 보니 나는 그냥 단순 값으로 포스트맨에 출력되었다.

뭐지? 뭐가 잘못된 거지 하면서 고민하다 보니까 객체로 반환을 하면 되는 것이었다 ㅜ

세 번째 과제는 강의를 들으면서 익명, 람다식 등 잘 기억이 나지 않았는데 마침 강사님께서 과제로 내주셨다

나도 코딩 님의 자바 강의에 들으면서 익명함수, 람다 식을 다시 공부했다. 좀 더 익숙해질 때까지 계속 사용해 봐야겠다.

아직 초반이라 그런지 사실 강의는 매우 재밌었다. 그렇지만 스스로 자바개념이 아주 부족하다고 생각하기에

주말을 활용하여 자바 개념과 강의 내용을 복습해 봐야겠다!

댓글을 작성해보세요.