블로그

Yoo Seung Hwan

[인프런 워밍업 클럽 2기 백엔드 프로젝트 과정] 1주차 발자국

참여 동기바야흐로 2024년 8월 13일 1년 6개월간의 군생활을 마치고 전역했습니다.전역 후 아직 미래에 뭘 할지 몰라서 게임 개발, 웹 개발 등등 이것저것 뚝딱이면서 시간을 보내고 있었는데... 메일함에서 발견한 인프런 워밍업 클럽2기 홍보 메일독학의 한계항상 물어볼 곳을 찾고 싶었다.아마 대부분의 초보 코딩 독학러들이 하는 고민일까 싶습니다. 강의를 듣고 내가 프로젝트를 해나가도 내가 하는 방법이 맞는 걸까? 내가 짠 코드가 쓸만한 코드인가? 누군가가 내 코드를 보고 리뷰해줬으면 좋겠고 내가 하고 있는거에 대한 피드백을 해주기를 원했습니다. 부트 캠프는 좀 힘들고...그렇다고 부트캠프나 따로 받기에는 지역도 서울 경기 지방으로 한정되어 있고 대부분 6개월 정도의 긴 기간의 대면 수업을 요구합니다. 지방대생인 저로서는 그런 부트캠프보다는 기간이 짧고 비대면인 워밍업 클럽은 최적의 조건이였습니다. 다른 사람들 생각도 좀 들어보고 싶다.아직 낯설지만 천천히 가보겠습니다.덤으로 다른 개발자들과 소통할 수 있는 창구가 생기는 것 또한 마음에 들었습니다. 다른 개발자들의 생각과 공부법에 대해 궁금한점이 많았던 저에게 워밍업 클럽은 더없이 좋은 기회라 생각하여 신청하게 됬습니다.   1주차 발자국코틀린과 백엔드에 대해 몰라도 따라갈 수 있었습니다.처음에는 코틀린과 스트링 부트에 대해 아는게 하나도 없어서 잘 따라갈 수 있을까 걱정했었는데 양질의 강의 자료와 자세한 설명덕분에 이해하기 수월했습니다. 특히 시작전에 완성된 결과물과 기능에 대해 설명해주셔서 코틀린을 잘 몰라도 코드의 의도를 파악할 수 있어서 좋았습니다. 더 알고 싶은 부분들은 생활코딩 강좌와 구글 검색 chat gpt와 함께 해결해나갔습니다.  1일차 - 섹션1 웹 개발 기본과 프로젝트 준비개발할 프로젝트에 대한 기능 설명과 웹의 동작 원리에 대해 배웠습니다.I. 웹 서비스 구성 요소1) 클라이언트요청 주체 2) 서버응답 주체서버간 통신에서는 서버가 요청 주체가 될 수도 있음  3) 데이터베이스데이터의 집합RDBMS를 의미하기도 함  II. 브라우저에서 주소창을 입력하면 일어나는 일1) 클라이언트 <-> DNS클라이언트가 DNS에 도메인을 보내면 DNS에서 도메인에 해당하는 IP 주소를 찾아서 알려준다. 2) 서버에 데이터 요청클라이언트가 전달된 IP 주소를 통해 서버에 작업을 요청하며 작업에 필요한 데이터를 함께 전달 3) 서버에서 작업 처리서버는 작업을 처리하며 일반적으로 데이터베이스에 대한 CRUD(삽입, 조회, 수정, 삭제) 등의 작업을 수행한다. 4) DB 결과 반환데이터베이스가 서버에서 요청한 결과를 반환한다. 삽입, 수정, 삭제의 경우 작업의 성공 여부를 응답하고 조회의 경우 조회도니 데이터를 전달한다. 5) 작업 결과 클라이언트에 전달서버가 반환된 결과를 클라이언트에 응답 한다.III. 웹 프레임워크와 Spring1) 웹 프레임워크동적 웹 서비스 개발을 편리하게 만들어주는 도구라이브러리와 다른 점은 제어의 주도권이 프레임워크에 있다. (라이브러리는 사용자가 주도권을 가짐)2) Spring Framework자바 기반의 웹 프레임워크웹 서버 개발을 모듈화 3) MVC 패턴 (Model-View-Controller)소프트웨어 아키텍처 디자인 패턴 중 하나데이터와 화면 전달 과정의 역할을 분담해 놓아 유지보수성을 높임  1) Model : 데이터 담기 2) View : 사용자에게 보내지는 화면 담당, 데이터 꺼내옴3) Controller : 요청 받아 작업 수행, Model에 데이터 넣음   4) 레이어드 아키텍처(Controller-Service-Repository)가장 대중적인 소프트웨어 아키텍처 기능별로 세가지 계층으로 구분됨Presentation(Controller)클라이언트가 요청할 수 있는 인터페이스를 정의 Business(Service)목적에 맞게 데이터를 처리 Data Access(Repository)데이터베이스에 접근하여 작업 요청, 다양한 데이터베이스 처리 방법을 제공하면 여러 서비스에서 공통적으로 사용할 수 있다.  5) 스프링 Bean과 의존성 주입(Dependency Injection)Bean : 스프링에서 관리되는 객체를 의미한다. 스프링 컨테이너가 주체가 되어 객체를 관리하는 것 이를 제어의 역전(Inversion of Control), IoC이라고 한다. 처음에는 상속과 동일한 것이라고 생각했는데 상속과는 분명한 차이점이 있었다.Chat Gpt 검색에 따르면 상속과 DI의 차이점은 의존성을 내부에서 관리하냐 외부에서 관리하냐에 따른 차이라고 한다.의존성 주입은 의존성을 외부에서 관리하므로 객체간 결합도를 낮추어 독립적으로 이용되어 코드를 유연하게 구성할 수 있는게 장점이라고 한다. 상속의 목적은 공통 기능을 공유하여 코드의 중복을 줄이는 것, 의존성 주입은 객체간의 결합도를 줄이고 코드 유연성을 높이는것에 초점이 맞춰져 있다. ex) Service와 Client 객체가 있을때 아래와 같이 외부에서 객체를 주입한다.val service = Service() val client = Client(service) client.doWork()  IV. HTTP와 REST API HTTP(Hyper Text Transfer Protocol)네트워크로 통신하는 두 컴포넌트 간의 통신 규약요청/응답1) RequestStartLine, Header, Body로 이루워짐Start Line : HTTP 메서드 , URL, HTTP 버전을 표시Header : 컨텐츠의 길이, 유형, 클라이언트 정보 표현Body : 서버에서 작업을 처리하기 위해 필요한 실질적인 데이터2) ResponseStartLine, Header, Body로 이루워짐Start Line : HTTP버전, 상태 코드, 메시지를 표현Header : 컨텐츠의 길이, 유형, 클라이언트 정보 표현Body : 응답 결과 데이터HTTP 요청 메서드Get, Post, Put, Patch, Delete각각 Read, Create, Update, Delete 작업을 요청할 때 사용c.f) Put과 Patch의 차이점 : Put은 리소스 전체를 새 데이터로 교체, Patch는 리소스의 일부만 수정HTTP 상태 코드요청의 처리 결과를 표현하는 코드 100 단위로 의미를 가지며, 상세한 코드로 구체적인 결과를 표현하기도 한다.200 : Ok300 : Multiple Choice400 : Bad Request500 : Internal Server Error Rest ApiHttp 통신으로 동작하는 어플리케이션 기능을 정의하는 컨벤션 강제성은 없음URL을 이용한 표현HTTP 메서드를 활용한 행위의 표현HATEOAS 준수복잡한 비스니스에서는 REST를 준수하기 어렵기 때문에 팀의 컨벤션을 만들어두는 것이 좋다. V. 데이터베이스의 정의데이터의 집합, DBMS관계형 DB, 비관계형 DB로 나누어짐관계형 DB는 표를 통해 데이터를 표현하며 각 표(테이블)은 관계를 가짐 비관계형 DB는 관계형 DB를 제외한 모든 DB (key-value형 등) VI. JPA(Java Persistence Api)자바 ORM 기술 표준 인터페이스1) ORM인스턴스와 관계형 데이터베이스를 매핑해주는 기술 2) 트랜잭션여러개의 DB 작업을 하나로 묶어주는 것 (두 작업이 모두 실패하거나 성공하도록 묶는 것)     2일차 - 섹션2 개발 - Domain흠... 기본 문법도 모르군객체 지향 프로그래밍도 알고 강의에서 어떤 역할을 하는 코드인지 계속해서 설명해주셔서 코드를 이해하는데 막히지는 않았습니다. 설명이 없는 개념은 대충 추론해가며 강의를 빠르게 들었습니다. 하지만 워밍업 클럽 미니 프로젝트를 위해서는 결국엔 기본 문법에 대해 어느 정도 알고 있어야 할것 같아 강의 코드를 중심으로 GPT와 유튜브 무료 코틀린 강의를 보면서 독학하는 시간을 길게 가져갔습니다. (Annotation과 Package에 관해서도 하나도 몰랐었을 정도로 무지했습니다...) 강의를 보고 따라한 후 Chat Gpt에 코드를 복붙 필요한 개념에 대한 간단한 설명과 함께 부탁했고이를 토대로 개념을 간단하게 학습한 후 추가적으로 궁금하거나 더 알아보고 싶은 부분을 적어 놓은 후 2일차 공부를 마무리 했습니다. 3~4일차 - 복습 및 과제강의를 빠르게 한 번 더 훝어본 후 2일차에 적어 놓은 부분을 구글 검색과 유튜브 등으로 해결 했습니다. 알바를 하면서 모르는 개념을 공부하고 과제도 하다 보니 시간이 촉박했지만 속도보다는 더 자세하게 이해하는게 더 중요하다고 생각해서 개념 공부에 시간을 많이 투자했습니다. 다행히 1주차에는 익숙한 깃에 대한 개념 강의가 섞여 있어서 좀 더 여유롭게 과제에 투자할 수 있는 시간이 있었습니다. 1주차 과제 - 프로젝트 ERD 작성음 분명 강의 들었을땐 이해됬었는데강의에서 사용한 포트폴리오 사이트에 대한 테이블 설계에 대해서는 이해가 정말 잘 되었습니다. 하지만 제 프로젝트에서는 테이블을 어떻게 나눠야 할지 아직 이해가 부족했습니다.추가로 생활코딩님 유튜브를 보면서 공부한 후 다시 강의를 들으니 이해가 훨씬 수월 했습니다. 혹시 저처럼 테이블 설계에서 어려움을 느꼈던 분들은 보시면 도움이 될거 같습니다.https://www.youtube.com/watch?v=1d38YZKCM88&list=PLuHgQVnccGMDF6rHsY9qMuJMd295Yk4sa 처음에는 ERD를 나눌 때 HTML, CSS 작성할때처럼 종속관계가 있어야 좋다고 생각했었지만 강의를 듣고나서는 유지 보수와 확장을 고려해 서로 간의 의존도를 줄이는게 중요하다는걸 알았습니다. 최종적으로 작성된 ERD입니다. 전체 구성사용자 -> 목표로 선택된 책 -> 도서별 세부 목표 -> 목표마다 달린 댓글 구조로 설계했습니다. 사용자 -> 목표로 선택된 책1:N 관계입니다 한명의 사용자가 여러개의 책을 선택할 수 있기 때문에 이렇게 설계했습니다. 처음에는 웹에 있는 도서 목록을 크롤링해서 DB에 넣은 다음 도서 선택을 하는 식으로 할까 고민했었는데 크롤링할 양도 많고 DB에 없는 책을 목표로 선정하고 싶은 경우가 생길 것 같아서 그냥 사용자가 직접 목표 책에 대해 작성할 수 있도록 설계하기로 했습니다. (추후에 서비스를 좀 더 확장하게 된다면 Yes24나 교보문고 같은 사이트에 연결하며 광고 등을 붙이는 구성을 생각하고 있습니다. 만약 그렇게 된다면 유저가 직접 작성한 책과 연동된 책을 따로 다른 테이블에 두어 작성하는것이 기존 DB를 수정하지 않아도 되서 더 좋을거 같다고 생각합니다.) 등록된 책 -> ChosenBook1:N 관계입니다. 등록된 책을 다른 여러 사람들이 선택해서 사용할 수 있기에 이렇게 작성했습니다.  책을 처음 등록하면 DB에 저장하고 다른 사람들이 같은 책을 목표로 삼을때 사용할 수 있도록 지정하면 DB 부담이 좀 줄어들거 같다고 생각해서 이렇게 설계했습니다. 목표로 선택된 책 -> 세부 목표1:N 관계입니다. 하나의 책의 여러개의 세부 목표를 둘 수 있기에 이렇게 설계했습니다.  user에 바로 연결할지 아니면 책과 연동해서 작성해야 할지 고민했는데 사용자별 목표를 보여주는 것보다는 도서별 목표로 보여주는 것이 좀 더 독서 습관 만들기라는 취지에 더 어울릴 것 같아 이렇게 설계했습니다. 세부 목표 -> 댓글1:N 관계입니다. 목표별로 다른 사용자들이 여러 댓글을 달 수 있기에 이렇게 설계하였습니다.   5일차 - 최종 점검최종 점검 이라 적었지만 거의 대부분은 다른 분들이 올리신 과제를 확인하면서 제 과제에 잘못된 부분은 없는지 확인하는 시간이였습니다. 아직 ERD에 대한 확신이 없어서 과제를 올린 후에도 여러번 고쳤던것 같습니다.https://github.com/dellyu03/bookjeogX2ㄴ 혹시 ERD나 프로젝트에 대해 지적해주실 분 있으시면 언제든 환영입니다.   1주차 회고군대를 전역하고 나서 새로 시작한 알바와 워밍업 클럽 과정을 병행해나간 바쁜 한 주였습니다. 휴학하면서 혼자서 공부할 때면 집중하기도 어렵고 딴 짓 하기 바빴는데 정확한 목표를 설정해 주시고 과제도 내주시니 집중이 더 잘되었습니다. 혼자서 그냥 설렁설렁 한달 공부했던 효과를 1주일 압축으로 해낸 것처럼 배운것도 정말 많았습니다. 앞으로도 이렇게 천천히 노력해가면서 꼭 완주를 해내겠다는 다짐을 하게된 한 주였습니다. 

백엔드워밍업클럽스터디기록백엔드코틀린스프링부트

채널톡 아이콘