스터디/인프런

[인프런 워밍업 스터디 클럽 0기- BE] 3일차 강의 내용 정리(Section2)

행복한라이언 2024. 2. 20. 13:41
728x90
반응형

Section2 목표

  1. 디스크와 메모리의 차이를 이해하고, DB의 필요성을 이해한다.
  2. MySQL DB를 SQL과 함께 조작할 수 있다.
  3. 스프링 서버를 이용해 DB에 접근하고 데이터를 저장, 조회, 업데이트, 삭제할 수 있다.
  4. API의 예외 상황을 알아보고 예외처리를 할 수 있다.

1. (10강) DB와 MySQL 

  • 서버를 종료했다가 다시 시작했을 때, 유저 정보가 모두 사라지는 문제가 발생
  • 컴퓨터의 핵심 부품(간단설명) : CPU(연산) / RAM(메모리, 임시기억장치) / DISK(장기기억장치)
  • 우리가 서버를 실행시켜 API를 동작시키기까지 일어나는 일
    • 개발하고 있는 서버(코드)는 Disk에 존재한다. 
    • 서버를 실행시키면 Disk에 있는 코드 정보가 RAM으로 복사된다.
    • AP가 실행되면 '연산'이 수행되며 CPU와 RAM을 오간다.
    • 따라서, POST API를 통해 생긴 유저 정보는 RAM에 저장되어 있다.
    • 서버가 종료되면 RAM에 있는 모든 정보는 사라지게 된다.
    • 그러므로 다시 서버를 시작하면 유저 정보가 전부 사라진 것이다.
  • 서버에서는 어떻게 Disk에 '저장'할 수 있을까? ' - DataBase 활용!
    • DB - 데이터를 '구조화' 시켜 저장 
    • RDB - 데이터를 '표'처럼 구조화 시켜 저장
  • MySQL에 접근하는 방법
    • 1. IntelliJ Ultimate
      • 오른쪽 상단에 DataBase > +(New) > DataSource > MySQL > User: root > (Test Connection) > OK 
    • 2. CLI
      • iTerm > mysql -u root -p

2. (11강) MySQL에서 테이블 만들기

  • 테이블 생성하기: create table [테이블명] ( 필드명 타입 부가조건 ... )

  • auto_increment - 데이터를 명시적으로 넣지 않더라도 1부터 1씩 증가하여 자동기록된다.
  • primary key - 중복이 없으며(unique) null을 허용하지 않는다.
  • not null - name의 경우 null을 허용하지 않으므로 not null 부가조건 사용한다.
  • MySQL 타입 살펴보기
    • tinyint: 1바이트 정수
    • int: 4바이트 정수
    • bigint: 8바이트 정수
    • double: 8바이트 실수
    • decimal(A, B): 소수점 B개를 가지고 있는 전체 A자릿수 실수 ex) Deciaml(4, 2) = 12.23
    • char(A): A글자가 들어갈 수 있는 문자열
    • varchar(A): 최대 A글자가 들어갈 수 있는 문자열
    • date: 날짜, yyyy-MM-dd
    • time: 시간, HH:mm:ss
    • datetime: 날짜와 시간을 합친 타입, yyyy-MM-dd HH:mm:ss

3. (12강) 테이블의 데이터를 조작하기

  • 데이터 넣기: INSERT INTO [테이블명] (필드1, 필드2...) VALUES (값1, 값2....)
  • 데이터 조회: select (필드명) from [테이블명] where [조건] and(or) [조건]...

  • 데이터 업데이트: UPDATE [테이블명] SET 필드1이름 = 값, 필드2이름 = 값 ... WHERE [조건];
    • 특정 조건을 가진 필드의 값을 변경! ex) update fruit set price = 1500 where name = '사과';
    • WHERE[조건] 을 붙이지 않는다면 모든 데이터가 업데이트 된다.
  • 데이터 삭제: DELETE FROM [테이블명] WHRER [조건]
    • DELTET, TRUCATR, DROP의 차이에 대해서 탐구하기

3. (13강) Spring에서 DB 사용하기

  • 스프링부트가 MySQL에 접근하기 위해 설정이 필요하다. ▷ application.yml 만들고 설정하기

  • 스프링이 연결할 데이터베이스의 주소를 의미:  jdbc를 이용해서 localhost에 존재하고 mysql를 사용하며 접근하려는 DB는 library임을 의미한다.
url: "jdbc:mysql//localhost/library"
  • username, password: MySQL에 접근하기 위한 계정명, 비밀번호
  • driver-class-name: DB에 접근할 때 사용할 프로그램
  • 유저 정보 생성하는 API 변경 (메모리에 저장하는 List > DB에 저장)
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 사용방법
    • JdbcTemplate jdbcTemplate 필드를 생성하고 생성자를 만들 때 jdbcTemplate을 파라미터로 넣으면 된다.
  • String 타입의 sql을 작성하는데 변수는 ? 처리한다. ?를 사용하면 값을 유동적으로 넣을 수 있다.
  • 유저 정보 조회하는 GET API 변경
@GetMapping("/user")
public List<UserResponse> getUsers() {
    String sql = "select * from user";
    return 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);
        }
    });

}
  • jdbcTemplate.query(sql, RowMapper구현 익명 클래스)
    • sql의 실행결과(ResultSet rs)가 RowMapper(단축키: control + O)를 통해서 UserResponse로 변경해준다.
    • RowMapper는 쿼리의 결과를 받아, 원하는 객체로 반환해준다.
    • ResultSet에 getType("필드이름")을 사용해 실제 값을 가져올 수 있다.
    • 람다로 변경(단축키: option + enter)

 

728x90
반응형