[인프런 워밍업 클럽 1기 BE] 첫번째 발자국

[인프런 워밍업 클럽 1기 BE] 첫번째 발자국

이번 학기 취준을 시작하면서 자바를 공부하기 시작했습니다. 시간이 된다면 스프링도 공부해봐야겠다는 가벼운 마음으로 스터디를 신청했는데, 자바 + 스프링이 만만한 친구들이 아니어서 마음을 고쳐먹었습니다.

 

학습 내용 요약:

Section 0: 스프링으로 프로젝트를 시작하기 위한 환경 세팅 방법을 배웁니다.

1. 환경 세팅 과정

멘토님(태현님)께서 정말 상세하게 알려주시기 때문에 환경 설정에 큰 어려움은 없었습니다.

다만, 저는 MySQL을 이전에 설치했던 적이 있어서 설치 과정에 오류를 겪었습니다. (M1 에어 기준)

다른 분들께 도움이 되실까 싶어 해결 방법을 남깁니다.

 

"[MySQL] Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)"

 

이 오류를 겪었는데요, MySQL 서버와 소켓으로 통신이 잘 안 된다는 얘기입니다.

저는 /opt/homebrew/var/sql에 이전 데이터가 남아있어서 충돌이 발생했던 것 같습니다.

해결 순서는

1) brew uninstall mysql로 기존 MySQL을 삭제

2) rm -rf /opt/homebrew/var/mysql로 남은 파일을 제거

3) brew install mysql로 MySQL을 재설치

4) 설치 후, cd /opt/homebrew/Cellar/mysql/{mysql 버전}/support-files (경로 이동)

5) ./mysql.server start로 서버를 실행

입니다.

출처: [https://velog.io/@shyuuuuni/MySQL-Cant-connect-to-local-MySQL-server-through-socket-tmpmysql.sock-2-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0-%EC%82%AC%EB%A1%80]

 

Section 1:

생애 최초 API 만들기(GET, POST API)

스프링 부트를 처음부터 시작하는 방법과 서버 개발의 기본이 되는 네트워크 기본 지식, 그리고 GET, POST API를 작성하는 방법을 배웠습니다.

1. 라이브러리 vs. 프레임워크

- 기존에 라이브러리가 작은 범위, 프레임워크는 좀 더 큰 범위구나 생각하고 있었는데, 강의에서

"라이브러리는 미리 만들어진 기능을 (클래스, 메서드 등) 가져다 사용하는 것이고, 프레임워크는 다 준비된 코드에 필요한 정보만 넣어 사용하는 것이다. 즉, 라이브러리를 활용해 프로그램을 작성하는 것은, 김치를 사서 김치찌개를 만드는 것이고, 프레임워크를 활용해 프로그램을 만드는 것은, 원데이 클래스에 가서 선생님이 시키는 대로 김치찌개를 만드는 것이다."

는 얘기를 듣고 차이점이 이해되었습니다. 예를 들면, java.lang '패키지'의 System.out.println을 사용하는 것이지, java.lang 프레임워크의 println을 쓰는 게 아닙니다.

 

2. GET, POST API

- 기존에 파이썬으로 몇 번 서버를 작성한 적이 있어 할만하다고 생각했는데, 자바와 스프링으로 API를 구현하면서 에러를 많이 만났습니다.

1) private 필드를 사용해야 했는데, getter가 없어서 406 에러가 발생

2) 파라미터를 받는 생성자만 정의해두고, 기본 생성자는 정의하지 않아서, 배열을 정상적으로 읽어오지 못하는 문제

를 만났습니다. 그리고, 멘토님께서 주신 과제를 수행하면서 스프링보다 자바가 부족하다는 것을 느꼈습니다. 자바 공부를 더 열심히 해야겠습니다.

 

Section 2:

생애 최초 Database 조작하기

JDBC 템플릿을 활용해 DB를 직접 조작해보았습니다. 파이썬으로 DB를 조작하는 것과 비슷해서 이해가 잘 됐습니다.

1. 에러 핸들링

업데이트, 삭제 API의 경우 값이 업데이트 되지 않았거나, 삭제되지 않은 경우에도 Status 200을 하지 않도록 에러 핸들링을 한 부분이 기억에 남습니다.

 

2. 람다식과 익명 클래스 차이

람다식과 익명 클래스의 차이를 정리하다 보니, 그리 만만한 주제가 아니라는 생각이 들었습니다. 오라클에서 제공하는 자바 튜토리얼에는 내포 클래스(Nested Classes)라는 주제로 Local Classes부터 설명이 되어 있습니다. Local Classes -> Anonymous Classes -> Lambda Expressions 순으로 코드가 간단해지고, 담을 수 있는 정보의 양도 줄어듭니다. 하지만, 세 경우 모두 새로운 클래스를 만드는 것보다 코드가 간단해진다는 공통점이 있습니다.

출처: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

 

Section 3:

역할의 분리와 스프링 컨테이너

좋은 코드는 왜 중요한지, Controller를 Controller / Service / Repository 로 3단 분리하는 과정에 대해 배우고 스프링 컨테이너에 대한 기본 지식을 배웠습니다.

 

1. 좋은 코드(Clean Code)와 역할의 분리

사용자 요청을 통해 들어온 HTTP 바디 및 헤더를 처리하는 Controller부분과, DB 서버와 통신하며 값을 저장, 조회, 수정, 삭제하는 Repository, Controller와 Repository를 이어주는 Service까지 역할에 따라 기능이 분리되면서, 코드가 더 간단해지는 것을 볼 수 있었습니다.

 

2. 스프링 컨테이너 & 스프링 빈

스프링 서버를 시작하면 컨테이너라는 클래스 저장소를 시작하게 되는데, 이 안에는 스프링 빈이라고 하는 클래스들이 등록되고, 스프링 컨테이너가 스프링 빈 간의 의존성을 관리해준다는 내용을 배웠습니다.

그런데, 한 가지 궁금한 점이 있었습니다. 서버가 시작되고 스프링 컨테이너가 시작된다는데, 왜 컨테이너 안에 서버가 들어가는 게 아니고, 서버 안에 컨테이너가 들어가는지 궁금했습니다.  스프링 컨테이너와 도커 컨테이너가 헷갈려서 검색해보았는데, 둘은 이름은 같지만 아예 다른 개념입니다. 스프링에서 얘기하는 컨테이너는 주로 자바의 객체의 라이프사이클을 관리하는 기능을 합니다. 한편, 도커의 컨테이너는 실행 환경을 가상화하는 방법으로 이름만 같습니다. 그러니까 컨테이너 안에 서버가 들어간다고 할 때는, 도커의 컨테이너를 이야기 하는 것이고, 스프링 서버가 시작돼서 스프링 컨테이너가 시작했다고 하는 것은 서버 내부에 자바 객체를 관리하는 컨테이너가 시작했다는 이야기입니다.

 

3. IoC and DI

수업 시간에 스프링 빈을 이용하면, 사용자는 코드의 변경이 거의 없이 스프링 컨테이너가 필요한 스프링 빈을 찾아서 인스턴스화한다는 내용을 배웠고, 이러한 방식을 IoC(Inversion of Control, 제어의 역전), DI(Dependency Injection, 의존성 주입) 라는 개념을 배웠습니다. IoC, DI 개념이 조금 덜 와 닿았는데, 아래의 글을 읽으면서 조금 이해가 되었습니다.

 

https://velog.io/@ohzzi/Spring-DIIoC-IoC-DI-%EA%B7%B8%EA%B2%8C-%EB%AD%94%EB%8D%B0

 

글의 내용을 요약하자면 DI는 "패턴"이고, IoC는 프로그램의 제어권을 역전시키는 "개념"입니다. IoC를 구현하기 위해 DI를 사용할 수 있다.로 정리하는 것이 좋은 것 같습니다. 수업 시간에 배운 생성자를 사용하는 방식(Constructor Injection, 스프링 권장), Setter를 사용하는 방식(Setter Injection), 인터페이스를 주입하는 방식(Interface Injection)이 있습니다. 이 중 생성자와 Setter를 이용하는 방식은 수업 때 다루었지만, 인터페이스를 이용하는 방식은 처음 보았습니다. 하지만 세 가지 방식 모두 A라는 객체의 의존성을 외부에서 만들어 넣는(Dependency를 Injection) 하는 방식입니다.

IoC, DI를 활용하면 코드가 더 깔끔해지고, 클래스의 테스트가 쉬워진다고 하는데, 테스트 를 공부한 후에, 이게 어떤 의미인지 직접 확인해봐야겠습니다.

 

스터디에 임하는 자세:

스프링을 공부한지 이제 1주차이지만, 스프링이 간단한 프레임워크가 아니라는 것이 느껴졌습니다. 강의를 들으면 들을수록, 스터디 이후에도 계속 공부해야 겠구나 잘하려면 더 많은 시간을 들여야겠다는 생각이 들었습니다. 그리고 자바를 아직 너무 몰라서, 학교 수업 시간에 배운 내용 뿐만 아니라, 프로그램도 더 많이 작성해보고, 알고리즘 문제도 많이 풀어봐야겠습니다.

댓글을 작성해보세요.