[인프런 워밍업 클럽 0기 BE] - 첫 번째 발걸음
강의 수강
일주일 동안 학습했던 내용을 요약해주세요.
1주차(1 일차 ~ 5 일차)의 학습 내용.
서버 개발을 시작하기 위한 환경 설정부터 , 네트워크와 API, 데이터 연동에 대해 배웠고,
리팩토링을 통해 클린코드의 중요성에 대해 배웠다.
일주일 간의 학습 내용에 대한 간단한 회고를 작성해 주세요.
-> 강의를 들으며 작성한 강의노트를 바탕으로 작성
1 일차 | - 서버 개발을 위한 환경 설정 및 네트워크 기초
Java를 공부하기 전에 알아두면 좋을 것들! #1(JVM, JDK - 유튜브)
컴파일 :
컴퓨터는 생각보다 바보다. 그래서 우리가 작성하는 코드를 알아 먹지 못하기 때문에,
컴파일이라는 과정을 통해 바이너리코드(컴퓨터가 이해하는 0과 1)로 변환 해줘야한다.
자바는 컴파일러를 거쳐가기 때문에 운영체제(윈도우, 리눅스)에 영향을 받지않는다.
= 다른환경이라도 같은 결과
JVM , JRE, JDK
JVM : 자바 가상머신 (운영체제별로 존재)
JRE : 자바 실행 환경(JVM이 실행되기 위한 여러 라이브러리)
JDK : 자바 개발 도구 (JRE+개발을 위한 도구)
-> JDK는 버전이 있고 각 버전별로 새로운 기능이 추가되거나 기존 기능이 사라진다.
-> LTS란 다른 버전은 시간이 오래 지나면 지원하지 않는데, 오랫동안 지원해주는 버전을 말한다.
Java를 공부하기 전에 알아두면 좋을 것들! #2(빌드, 빌드툴 - 유튜브)
빌드
소스코드파일을 컴퓨터에서 실행할 수 있는 독립 SW가공물로 변환시키는 과정 (독립 SW가공물 = Artifact)
빌드의 세분화
1. 소스코드 컴파일
2. 테스트코드 컴파일
3. 테스트코드 실행
4. 테스트코드 리포트작성
5. 기타 추가설정 작업진행
6. 패키징 수행
-> 패키징 수행 : 오픈API들과 나의 코드를 하나로 묶는다.
7. 최종SW결과물(Artifact)
실행
내가 작성한 코드(테스트코드)를 컴파일을 거쳐 작동시켜 보는것
독립 SW가공물(Articfact)가 나올수도 있고, 나오지 않을수도 있다.
인터프리터 언어(자바스크립트, 파이썬) 은 컴파일이 필요없다.
빌드 툴
1. 소스코드의 빌드 과정을 자동으로 처리해주는 프로그램
2. 외부소스코드(외부라이브러리) 자동추가, 관리
정리
1. 빌드란 단순히 실행하는것과는 다르다.
2. 빌드 과정 자동화와 외부 라이브러리 관리를 위해 빌드툴이 사용된다.
1강. 스프링 프로젝트를 시작하는 두 번째 방법
정리
스프링 프로젝트를 설정해 시작하고 실행하는 방법과 서버란 무엇인지, 네트워크와 HTTP, API는 무엇인지
JSON은 무엇인지 등등 서버 개발에 필요한 다양한 개념에 대해 배웠다.
2강. @SpringasBootApplication과 서버
Annotation
마법같은 일을 자동으로 해줌.
예를들어,
@SpringBootApplication
실행에 필요한 모든 설정들을 자동으로 해준다.
서버 (기능을 제공하는 프로그램 or 그 프로그램을 실행시키고 있는 컴퓨터)
서버란 어떠한 기능을 제공하는 '것'을 의미한다.
ex) 회원가입 기능 / 정보 가져오기 기능/ 추천 기능
사람대신 컴퓨터가 이런 기능을 수행한다.
누군가의 요청이 있어야 기능을 수행한다.
ex) 시리야 오늘의 날씨를 알려줘
이 요청을 인터넷을 통해 하게된다.
3강. 네트워크란 무엇인가?!
정리
네트워크와 택배 시스템의 비교를 통해
IP
와도메인
,port
에 대해 학습하였다.
4강. HTTP와 API란 무엇인가?
정리
택배를 보내는 과정과의 비교를 통해 데이터를 주고 받을 때 사용하는 표준(HTTP)과 API에 대해 학습하였다.
HTTP(HyperText Transfer Protocol)
내놓아라(운송장을 받는 사람에게 요청하는 행위) / 파란집(운송장이 가는 장소)/ 둘째야(운송장을 실제 받는 사람) /
포션(운송장을 받는사람에게 원하는 자원)/ 빨강색 2개(자원의 세부조건)
과 같이 현실세계에서 데이터를 주고 받는 표준을 의미한다.
API(applicatino Programming Interface)
정보를 주고 받기 위해서는 서로 정해진 약속을 해야하고, 이 약속을 통해 특정 기능을 수행하는것.
ex) GET / portion?color=red&count=2
5강. GET API 개발하고 테스트하기
정리
덧셈 API를 만들어 보며 GET API를 만들어보며 DTO에 대해 학습하였다.
DTO(Data Transfer object)
HTTP 쿼리를 받았을때 적절한 객체가 있다면 스프링 부트가 알아서 그 값을 넣어서 전달하게 되는데,
이때 데이터를 전달하기 위한 적절한 객체를 DTO라고 한다.
6강. POST API 개발하고 테스트하기
정리
POST API를 만드는 과정에서 HTTP Body로 데이터를 받아보며 JSON에 대해 학습하였다.
JSON
객체 표기법, 즉 무언가를 표현하기 위한 형식
중괄호 안에 "Key": "value" 형식으로 표기한다
ex) {"name": "김영훈", "age": 99}
7~9강. 유저 생성 API와 유저 조회 API 개발
정리
앞서 배웠던 GET API와 POST API를 활용하여 유저 생성 API와 유저 조회 API를 만들어 보았다.
문제점
현재 유저 정보가 메모리에서만 유지되고 있기 때문에, 서버를 재실행 하면 모든 데이터가 사라지는 문제점이 있다.
10~16강. 생에 최초 Database 조작하기
정리
1. 디스크와 메모리의 차이를 이해하고, Database의 필요성에 대해 학습하였다.
2.MySQL Database를 SQL과 함께 조작하는 방법에 대해 학습하였다.
3.스프링 서버를 이용해 Database에 접근하고 데이터를 저장, 조회 , 업데이트 , 삭제하는 방법에 대해 학습하였다.
4. API의 예외 상황을 알아보고 예외를 처리해 보았다.
500 Internal server error
함수 내에서 함수가 정상종료되지 않고, 그 안에서 예외가 발생하였기 때문에 500 Internal server error 반환
문제점
현재 controller 에서 너무 많은 일을 하고있다.
1. DB 접근
2. create
3. read
4. update
5. delete
17~18강. 역할의 분리
정리
controller를 리팩토링 해보며 클린코드의 중요성에 대해 학습하였다.
하나의 함수가 너무 많은 기능을 수행하면 안되는 이유
1. 동시에 여러명이 수정할 수 없다.
2.읽고 이해하기가 어렵다.
3.한부분을 수정하더라도 함수 전체에 영향을 미칠 수 있다.
4.테스트가 힘들다.
5.유지보수성이 떨어진다.
updateUser(변환 전)
//변환 전의 userUpdate
@PutMapping("/user")
public void userUpdate(@RequestBody UserUpdateRequest request){
String readsql = "select * from USER WHERE id=?";
boolean userCheck = jdbcTemplate.query(readsql,(rs, rowNum) -> 0, request.getId()).isEmpty();
if(userCheck){
throw new IllegalArgumentException();
}
String sql = "UPDATE USER SET name=? WHERE id=?";
jdbcTemplate.update(sql, request.getName(), request.getId());
}
updateUser(변환 후)
1.api 진입 지점으로 HTTP Body를 객체로 변환한다. (controller)
2.유저가 있는지 없는지 예외처리한다. (service)
3.sql을 사용해 실제 database와의 통신을 담당한다. (repository)
@PutMapping("/user")
public void updateUser(@RequestBody UserUpdateRequest request){
service.updateUser(request);
}
//service
public void updateUser(UserUpdateRequest request) {
if (repository.isUserNotExist(request.getId())) throw new IllegalArgumentException();
repository.updateUser(request);
}
//repository
public void updateUser(UserUpdateRequest request) {
String sql = "UPDATE USER SET name=? WHERE id=?";
jdbcTemplate.update(sql, request.getName(), request.getId());
}
public boolean isUserNotExist(long id) {
String sql = "SELECT * FROM user WHERE id=?";
return jdbcTemplate.query(sql, (rs, rowNum) -> 0, id).isEmpty();
}
미션
미션을 해결하는 과정을 요약해 주세요.
어노테이션을 사용하는 이유를 정리하고 나만의 어노테이션을 만드는 방법을 고민하는 과제였다.
무엇을 만들어 볼까 고민하다 어노테이션을 통해 인자를 전달받고, 간단한 연산을 수행하는 계산기를 만들었는데
과제의 의도와 약간 미스매치였지 않나 하는 후회가 남는다.
다른 러너분들중에 @validated 어노테이션을 커스텀 어노테이션을 사용하여 맛깔나게 쓰신분이 계시던데
아마 그것이 과제의 의도와 좀 더 부합되는 활용법이 아닌가 싶었다.
조만간 validated 어노테이션과 커스텀 어노테이션에 대해 학습하고 정리해보아야겠다.
GET API와 POST API에 대해 학습하고 , 약간의 응용이 필요했던 과제이다.
@GetMapping("/api/day-of-the-week") //@DateTimeFormat으로 yyyy-MM-dd 형태로 변환해서 받는다
public ResponseEntity<DayOfWeekResponse> dateResponse(@RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate localDate) {
DayOfWeek dayOfWeek = apiService.dayOfWeekService(localDate);
DayOfWeekResponse dayOfWeekResponse = new DayOfWeekResponse(dayOfWeek);
return ResponseEntity.ok()
.body(dayOfWeekResponse);
}
이 당시, @RequestParam을 통해 넘어오는 date를 @DateTimeFormat를 통해 패턴화 시켜 받았는데,
질의응답시간에 springBoot 버전에따라 @DateTimeFormat을 사용하지 않아도 받을 수 있다는 것을 알게 되었다.
자바의 람다식이 왜 등장하였고 람다식과 익명 클래스가 어떤 관계가 있을지 정리하는 과제였다.
람다식을 사용하면서도 람다식이 어째서 등장했는지, 익명 클래스는 무엇이고 함수형 인터페이스가 무엇인지도
모르면서 사용하고 있었다는걸 깨달았다 ㅠ
2일차 과제와 유사한 API 생성 문제였다. AWS에서 database의 대소문자 구분 때문에 고생했던날이었다.
클린하지 않은 코드를 클린하게 리팩토링해보는 과제였다.
이 정도면 나쁘지 않은거 같은데 싶었지만, 다른 러너분들을 보니 아직도 많이 부족하구나.. 싶었다.
다음주 금요일에 태현님이 해당 코드 리팩토링을 진행하신다던데 벌써 기대가 된다.
댓글을 작성해보세요.