[인프런 워밍업 클럽 스터디 1기] BE 1주차 회고
첫번째 발자국
인프런 워밍업 클럽 스터디에 참여하여 일주일을 보낸 후 쓰는 첫번째 회고록.
Section 1 - 생애 최초 API 만들기
JVM
자바 가상 머신의 약자
os 별로 존재한다.
바이너리 코드들을 읽고 검증한다.
JRE
자바 실행 환경의 약자
JRE = JVM + 자바 프로그램 실행에 필요한 라이브러리 파일 등
JVM의 실행 환경을 구현
JDK
자바 개발 도구의 약자
JDK = JRE + 개발을 위한 도구(통합 개발 도구)
컴파일러, 디버그 도구 등이 포함되어 있다.
여러 버전이 있고, 각 버전별로 새로운 기능이 추가되거나 기존 기능이 사라진다.
여러 종류가 있고, 기능 자체는 동일하나 성능과 비용에 약간의 차이가 있을 수 있다.
빌드 : 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 SW 가공물(Artifact, 독립적인 하나의 파일)로 변환시키는 과정
실행 : 작성한 코드를 컴파일을 거쳐 작동시켜보는 것(독립 SW 가공물이 나올수도 있고, 나오지 않을 수도 있음)
빌드 과정 자동화와 외부 라이브러리 관리를 위해 빌드 툴이 사용되며, 자주 사용되는 자바 빌드툴에는 maven, gradle이 있다.
어노테이션
자동으로 설정/기능을 동작하게 하는 것
@ + (어노테이션으로 만들어둔) 클래스 이름
서버 : 어떤 기능을 제공하는 프로그램. 또는 그 프로그램을 실행시키고 있는 컴퓨터
클라이언트 : 서버에 어떤 기능을 요청하는 프로그램. 또는 그 프로그램을 실행시키고 있는 컴퓨터
HTTP : 컴퓨터가 네트워크를 통해 다른 컴퓨터와 데이터를 주고받을 때 사용되는 통신 규약(중 하나)
HTTP Method : HTTP 요청을 받는 컴퓨터에게 요청하는 행위(GET, POST, PUT, DELETE 등)
요청을 받는 컴퓨터(IP 주소 / 도메인)와 프로그램(port) 정보
Path : HTTP 요청을 받는 컴퓨터에게 원하는 자원
Query : 자원의 세부 조건(조건이 여러개면 &로 구분)
Body(JSON) : 저장할 자원의 정보
JSON : 객체 표기법. 중괄호 안에 "key": value로 표기하며, 속성 각각은 ,로 구분한다.
요청에 대한 HTTP 응답
200 OK (요청이 잘 처리됨)
300 Moved Permanently (다른 곳으로 옮겨가라)
404 NotFound (요청한 것을 찾을 수 없음)
500 Internal Server Error (우리 내부에 문제가 생김)
응답에는 추가 정보(바디)를 담을 수도 있음
API
정해진 약속을 하여 특정 기능을 수행하는 것
클라이언트와 서버는 HTTP를 주고 받으며 기능을 동작하는데 이때 정해진 규칙
API의 구성 요소(명세)
HTTP Method
HTTP Path
Query(key와 value)
API의 반환 결과
@RestController
: 주어진 클래스를 Controller(API의 입구)로 등록한다 -> 현재 클래스를 API의 진입 지점으로 만들어줌
@GetMapping("/add")
: 아래 함수를 HTTP Method가 GET이고 HTTP Path가 /add인 API로 지정한다.
@RequestParam
: 주어지는 쿼리를 함수 파라미터에 넣는다 -> 같은 이름을 가진 쿼리의 값이 함수의 argument로 들어온다
@RequestBody
: HTTP Body 안에 담긴 JSON을 DTO 객체로 변환 (DTO : 정보를 전달하는 역할의 객체)
Section 2 - Database 조작하기
Database의 필요성
: API를 통해 생성된 정보는 단기 기억장치인 RAM에 기록되는데, RAM에 기록된 정보는 서버가 종료되면 사라지기 때문에 DISK에 장기 저장하기 위해 DB를 사용한다.
Database : 데이터를 구조화해서 저장하는 것
RDB(Relational DB) - MySQL : 데이터를 표처럼 구조화해서 저장하는 DB
SQL(Structured Query Language) : 표처럼 구조화된 데이터를 조회,저장 등 조작하는 언어
-> MySQL을 사용
DDL(Data Definition Language) : 데이터를 정의하는 언어
데이터베이스 만들기 :
create database [데이터베이스 이름];
데이터베이스 목록 보기 :
show databases;
데이터베이스 지우기 :
drop database [데이터베이스 이름];
데이터베이스 안으로 들어가기 :
use [데이터베이스 이름];
(특정 데이터베이스 안으로 들어간 후)
테이블 목록 보기 :
show tables;
테이블 만들기 :
create table [테이블 이름] (
[필드1 이름] [타입] [부가조건],
[필드2 이름] [타입] [부가조건],
...
primary key ([필드이름])
);
테이블 제거하기 :
drop table [테이블 이름];
DML(Data Manipulation Language) : 데이터를 조작하는 언어
데이터를 넣는다 = 생성, create
데이터를 조회한다 = 조회(읽기), retrieve of read
데이터를 수정한다 = 업데이트, update
데이터를 삭제한다 = 제거, delete
-> CRUD
데이터 넣기
INSERT INTO [테이블 이름] (필드1이름, 필드2이름, ...)
VALUDES(값1, 값2, ...)
필드 이름과 값의 순서가 맞아야 한다
명령어는 소문자로 써도 상관 없다
auto_increment로 지정된 필드값은 지정해주지 않아도 자동으로 설정된다
데이터 조회하기
SELECT * FROM [테이블 이름];
* 대신 필드 이름을 넣을 수 있다. 여러 개 넣는 것도 가능하다.
SELECT * FROM [테이블 이름] WHERE [조건];
where을 이용해 필터(조건)을 걸 수 있다.
AND 또는 OR을 이용해 조건을 이어 붙일 수 있다.
조건에는 =, <= 외에도 !=, <, >, >=, between, in, not in 등이 있다.
BETWEEN [범위의 시작값] AND [범위의 끝값] : 양끝값을 포함한 범위 내의 값들만 가져온다.
IN(조건1, 조건2) : 여러 조건을 한 번에 표시할 때 사용
NOT IN() : 괄호 안 조건들에 포함되지 않는 데이터만 조회할 때 사용
데이터 업데이트하기
UPDATE [테이블 이름] SET 필드1이름=값, 필드2이름=값, ...
WHERE [조건];
where 절을 사용해 [조건]을 붙이지 않으면, 모든 데이터가 변경(업데이트)되니 주의해야 함
데이터 삭제하기
DELETE FROM [테이블 이름] WHERE [조건];
[조건]을 붙이지 않으면 모든 데이터가 삭제되니 주의할 것!
Spring에서 Database 사용하기
사람이 아닌 스프링 서버가 MySQL 서버에 접근하게 하는 것
application.yml 만들고 설정
spring:
datasource:
url: "jdbc:mysql://localhost/library"
username: "root"
password: "5502"
driver-class-name: com.mysql.cj.jdbc.Driver
API 변경
jdbcTemplate을 이용해 SQL을 날릴 수 있다.
SQL을 만들어 문자열 변수로 저장한다. 이때 값이 들어가는 부분에 ?를 사용하면, 값을 유동적으로 넣을 수 있다.
jdbcTemplate.update()는 INSERT, UPDATE, DELETE 쿼리에 사용할 수 있다(데이터에 변경을 주는 쿼리). 첫 파라미터로는 sql을 받고, ?를 데신할 값을 차례로 넣으면 된다.
jdbcTemplate.query(sql, RowMapper 구현 익명클래스) : mapRow라는 함수를 override하고, override한 MapRow 안에서 sql의 실행 결과가 나오면 그 결과들의 데이터를 가져와 UserResponse(dto)로 바꿔준다.
Section 3 - 역할의 분리와 스프링 컨테이너
클린 코드가 중요한 이유
코드 : 요구사항을 표현하는 언어
-> 개발자는 요구사항을 구현하기 위해 코드를 읽고 작성한다.
-> 코드를 읽는 것은 필수적이고 피할 수 없으므로, 코드만 보고도 의미를 명확하게 파악할 수 있도록 코드를 작성해야 한다.
클린 코드
함수는 최대한 작게 만들고 한 가지 일만 수행하는 것이 좋다.
클래스는 작아야 하며 하나의 책임만을 가져야 한다.
Controller의 함수 1개를 역할에 따라 분리
API의 진입 지점으로써 HTTP Body를 객체로 변환하고 있다. -> Controller의 역할로 남겨둠
현재 유저가 있는지, 없는지 등을 확인하고 예외 처리를 해준다. -> Service의 역할로 분리
SQL을 통해 실제 DB와의 통신을 담당한다. -> Repository의 역할로 분리
3가지 역할로 구분된 구조
controller : API와 HTTP 역할 담당
service : 분기 처리, 로직 담당
repository : DB와의 접근 담당
* controller는 service를 사용하고, service는 repostory를 사용함
** DTO는 계층 간의 정보를 전달하는 역할(여러 계층을 왔다갔다 함)
-> 이런 구조를 Layered Architecture라고 한다!
과제
과제3
https://shimmer-exoplanet-946.notion.site/3-07f12f6102e24a509e57519f890b43ec?pvs=4
자바의 람다식과 익명 클래스에 대해 공부해보는 과제였다. 강의를 들으면서 람다식이라는 개념을 처음 접했는데 과제를 통해 따로 공부할 수 있어서 좋았다. 수업을 들을 때도 익명 클래스 부분에서 버벅였는데, 과제를 진행하며 블로그 글을 읽어도 완전히 이해한 것 같지 자바에 대한 공부가 추가로 필요하겠다고 느꼈다.
회고
인프런 워밍업 클럽 스터디에 참여한지 벌써 일주일이 지났다. 이번주에 다른 일들이 많이 겹쳐 내 생각보다 더 힘들었지만, 혼자서 공부하는 것보다 이점이 훨씬 많았다.
진도표에 매일 공부할 분량이 체계적으로 정해져 있어 내가 별도로 학습 계획을 짜지 않아도 계획적으로 공부할 수 있었다. 여러명이 함께 강의를 수강하는 스터디 방식이라 강의 듣는 것을 미루지 않고 진도표에 맞춰 학습할 동기부여가 되었다. 추가적으로 주어지는 과제를 통해 배운 내용에 대해 스스로 학습하고 정리할 수 있는 것도 좋았다.
강의 내용도 매우 흥미로웠다. 자바와 스프링에 대한 기초 지식부터, 백엔드 개발에 필요한 서버 관련 내용까지 차근차근 정리할 수 있었다. 또한 API 설계 및 개발 과정을 실습으로 진행하며 각 기능이 어떻게 동작하고 구현되는지 직접 코딩을 하며 익혔다.
다른 일들이 겹쳐 과제를 많이 놓치기도 하고 실습 중 자바에 대한 이해가 부족하다는 것을 느껴 조금 아쉬운 1주차였지만, 2주차부터는 좀 더 많은 시간을 투자하고 자바에 대한 학습도 병행하며 더 충실한 일주일을 보낼 수 있도록 노력할 것이다.
댓글을 작성해보세요.