블로그

요즘 백엔드 취업 시장에서 코프링이 핫하다던데?

코틀린(Kotlin)은 젯브레인즈(JetBrains)에서 개발한 크로스 플랫폼 범용 프로그래밍 언어입니다. JVM 기반의 언어이면서 자바(Java)와 100% 호환되도록 설계되었습니다. 구글은 2019년부터 코틀린을 안드로이드 개발 공식 언어로 지정했어요. 간결한 문법, 안정성, 다양한 기능이 있다는 장점과 함께 전 세계적으로 사랑받고 있는 언어입니다.그동안 백엔드에선 자바 언어와 스프링 프레임워크의 조합이 가장 압도적인 점유율을 차지하고 있었는데요. 최근엔 코틀린을 도입하거나 자바를 코틀린으로 대체하려는 기업이 늘면서 코틀린 언어와 스프링 프레임워크의 조합, 일명 '코프링'이 주목받기 시작했습니다. 실제로 현재 취업 시장을 살펴보면 코틀린 언어를 다루는 능력을 자격이나 우대 사항으로 기재해 두는 기업을 어렵지 않게 찾아볼 수 있어요. 하지만 비교적 최근에 주목받고 있는 만큼 백엔드 현업에서의 코틀린 혹은 코프링 관련 사례나 자료를 찾는 건 쉽지 않죠.앞으로 사용이 더 늘어날 것으로 전망되는 코틀린, 코틀린과 코프링의 세계에 발 빠르게 뛰어들고 싶다면 지금 시도해 보는 건 어떨까요?•••Java 개발자를 위한실무밀착형 코프링을 배우고 싶다면?지금 인프런 프리즘 [자바 개발자를 위한 실전 코프링 입문 (Kotlin + Spring)]을 통해 학습해보세요.https://www.inflearn.com/roadmaps/703•••인프런 프리즘 브랜드 스토리 읽어보기 >>

백엔드코틀린Kotlin스프링SpringSpringBoot스프링부트코프링백엔드인프런프리즘InflearnPrism

[인프런 워밍업클럽 백엔드 3기] 4주차 발자국

강의 수강[실습] 스프링 시큐리티 로그인 개발 [실습] Docker로 MySQL 실행하기 [실습] Docker로 프로젝트 빌드하기 [실습] Google Cloud Platform에서 Compute Engine 인스턴스 생성하기 [실습] Compute Engine에서 도커 컨테이너 실행하기[실습] 도메인 연결하기 [실습] HTTPS 적용하기  학습정말 오랜만에 도커로 프로젝트를 빌드했는데, 또 처음같았다. 역시 복습 없이는 학습은 되지 않는다...... 구글 클라우드 플랫폼으로 인스턴스 생성은 이번에 처음 해봤다! AWS랑 거의 유사한 것 같다. HTTPS 적용하는 수업도 짧지만 유익했던 것 같다 미션[미션6] 가상 프로필을 나의 프로필로 바꾸기, [미션7] 내 포트폴리오 도메인 공유하기포트폴리오를 이제 막 만들고 있어 내용 준비가 미흡했기 때문에 제출 또한 할 수 없었다. 어서 포폴 다 완성하여 여기도 잊지않고 바꿔놓고싶다 소감3~4주간 집에 오면 바로 인프런 인텔리제이 켜서 강의 1시간 듣고 3시간 추가 실습 미니 프로젝트로 복습하는 삶을 살았다... 최근 몇달 힘들다고 퇴근하면 바로 누웠는데 이걸 벗어나 오랜만에 열심히 살아본 거 같아서 뿌듯하다코틀린 이제는 혼자서 기본 코드까지는 작성 할 수 있게 됐는데, 초기에는 아예 처음보는걸 대뜸 실습부터 하니 눈에 안들어와서 보고 또보느라 시간이 더걸렸다 JPA도 재직중인 회사에선 전혀 쓰지 않아 진짜 거진 1년반만에 사용하다 보니 특히 다대다 나올땐 머리 쥐나는줄 아무튼 한창 진행중일때 어느날은 내가 이걸 왜 한다고 했을까 하면서 퇴근하기 싫기도 했는데 역시 이것 또한 지나간다? 끝나고 보니 내게 남은건 코틀린을 조금이라도 알게됐다는 사실과 다음 코틀린 공부는 지금보다는 수월할 것 같다는 생각과 JPA 빨리 다시 해야하는데 하는데 상태에서 벗어났다는 것과 아무튼 좋은 것 밖에 없다 게다가 코치님께서 진행해주신 OT, 중간점검 전부 모두 너무너무 알찬 내용이라 사실 줌 들으며 내 개발을 하려 했는데 그럴 수가 없었다 개인적으로 전 집중력이 안좋은 사람인데 풀로 집중해서 볼 정도로 정말 유익했다. 강의 진행과 스터디 진행 전부 꼼꼼하게 진행해주신 정보근 코치님께 감사드리고 인프런 스터디 진행자 분들도 고생많으셨다 인프런 스터디 참여하길 잘했다 나처럼 자력으로 공부할 의지가 잘 안붙는 사람은 꼭 하는걸 추천한다 다음엔 물론 딱 하나만 할 것이다 두개 같이 하는 분들 존경한다

백엔드스프링부트코틀린

ykm8864

[인프런 워밍업 클럽 백엔드 프로젝트 스터디 3기] 2주차 발자국

학습 내용2주차 발자국입니다.1. 데이터베이스 및 리포지토리데이터베이스 초기화: H2 및 MySQL을 활용한 데이터베이스 설정과 application.yml 환경 분리리포지토리 개발: JpaRepository<T, ID> 상속을 통해 기본적인 CRUD 메서드 활용리포지토리 테스트 코드 작성: Mock을 활용한 단위 테스트 (@DataJpaTest, @MockBean)리포지토리 성능 개선: N+1 문제 해결2. 엔티티 및 서비스 개발클래스 생성: 엔티티 정의 (@Entity, @Id, @GeneratedValue)DTO 개발: 엔티티와 분리된 data class 정의로 API 응답 최적화서비스 개발: 비즈니스 로직을 @Service 클래스에서 관리하여 Controller와 역할 분리서비스 테스트 코드 작성: @InjectMocks와 @Mock을 활용한 Mockito 기반 테스트3. 컨트롤러 및 API 개발컨트롤러 개발: @RestController와 @Controller를 활용한 API 및 뷰 렌더링 처리컨트롤러 테스트 코드 작성: MockMvc를 활용하여 API 응답 검증 (@SpringBootTest, @AutoConfigureMockMvc)4. Thymeleaf 기반 UI 개발부트스트랩 템플릿 적용: Start Bootstrap을 활용한 기본 레이아웃 구성템플릿 수정index.html: 주요 콘텐츠 및 네비게이션 구성resume.html: 경력 및 기술 스택 표시projects.html: 프로젝트 목록을 동적으로 표시레이아웃: th:fragment를 활용한 네비게이션 및 푸터 분리5. 인터셉터 개발인터셉터 활용: HandlerInterceptor를 구현하여 요청 전/후 로직 추가주요 기능: 인증/인가 체크, 요청 로깅, 공통 헤더 처리Keep (만족했고, 앞으로도 지속하고 싶은 부분)리포지토리와 서비스의 명확한 역할 분리로 유지보수성이 향상된 점을 느꼈다Mock 테스트를 활용하여 서비스 및 컨트롤러 단위 테스트를 효과적으로 구현했는데, 이전에 워밍업클럽에서 테스트코드를 들어서 그런지 쉽게 이해가 됐다Thymeleaf Fragment 적용으로 중복 코드 제거 및 템플릿 유지보수 능력을 길렀다Problem (아쉬웠던 점)jpa 성능 최적화에 대한 지식이 아직 부족한 거 같아서 김영한 강사님의 강의를 수강해볼 예정Thymeleaf에서 동적 데이터 처리의 한계가 있어 React/Vue 같은 프론트엔드 연계를 고민해야 할텐데 관련하여 지식이 너무 적다 Try (다음에 시도해볼 점)N+1 성능문제 개선 및 QueryDSL을 활용한 복잡한 검색 기능 최적화API 개발 시 OpenAPI(Swagger) 문서 자동화 적용Thymeleaf 대신 React와 연동인터셉터 로직이 복잡해질 경우 AOP를 활용하는 방법도 고려할 필요가 있어보이는데 AOP 구현하는 미니프로젝트 해볼 예정

백엔드코틀린백엔드워밍업클럽3기

ykm8864

[인프런 워밍업 클럽 백엔드 프로젝트 스터디 3기] 1주차 발자국

학습 내용스프링, jpa, 코틀린을 통해 나만의 포토폴리오 등록 사이트를 개발해보는 첫 발자국입니다.실습 전 이론 학습이 강의의 가장 좋은 점이다. 기초적인 지식을 먼저 학습한 다음 실습을 접할 수 있어 지식의 공백이 생기지 않는다.물론 이미 아는 부분이 많아 가볍게 들었지만 잘하는 개발자 분들을 보면 같은 지식을 본인만의 쉬운 언어로 정리하여 체계적으로 잘 알려주시는 경향이 있다. 이번에도 그러한 점을 느꼈다. 가장 흥미로웠던 부분은 프로젝트 패키지를 나눌 때 였다. 개인적으로 DDD를 학습 한 후로 이상하게 프로젝트 패키지를 나누는 행위가 이전보다 더 부담스럽고 생각이 많아지곤 했다. 하지만 강사님이 프로젝트 패키지를 나누면서 어떤 생각을 하셨고 어떠한 근거로 이렇게 나눴다 라는 말씀을 듣고 DDD원칙에 완전히 준수한 패키지 구성은 아니였지만 꼭 DDD에 걸맞게 패키지를 구성하는게 옳은 것은 아니구나, 역시 은탄환은 없구나 라는 것을 한번 더 느끼며 흥미롭게 시작했다. 테이블 설계역시 프로젝트의 시작은 테이블 설계이다. N:M 관계를 어떻게 풀어나가는지 학습해보자.대표적으로 프로젝트 테이블을 봐보자.(1) project <-> project_skill <-> skill 관계 분석현재 project_skill 테이블에는 다음 컬럼이 있다.project_id (FK) -> project의 project_id를 참조skill_id (FK) -> skill이 테이블은 다대다(N:M) 관계를 풀기 위한 "연결 테이블" 역할을 수행한다. 즉, 한 프로젝트가 여러 개의 기술(skill)을 가질 수 있고, 한 기술(skill)이 여러 개의 프로젝트에 속할 수 있는 관계이다.project_skill 테이블이 N:M 관계를 풀어주는 역할을 한다! 이런 식으로 N:M관계를 서로 1:N , M:1로 만들어주기 위해서는 양쪽의 PK값을 PK로 복합키로 가지고 있는 매핑 테이블이 필요하다.(2) project <-> project_detail 관계 분석project_detail 테이블에는 project_id가 FK로 존재.1:다(1:N) 관계이더. 즉, 하나의 프로젝트가 여러 개의 상세 정보를 가질 수 있음.이런 식으로 RDBMS에 대하여 어떻게 관계를 형성할 것인지 사전에 정확하게 설계하는 습관이 중요하다. 테이블은 운영 상에 정보를 바꾸는 것이 제약이 크기 때문에 신중하자. 깃과 친해지기깃 명령어는 빠르고 간결하게 내가 원하는 실행을 할 수 있게 도와준다. 이에 앞서 IDE에서 제공해주는 기본 GUI기능을 알아봤다.현재 깃 브랜치 정보 보는법View > Tool Windows > Git브랜치 이름 rename하는 법깃허브에 내 프로젝트를 올려두는 법Git > Manage Remote > 팝업창에 git url 입력 후 okcommit 친 것을 push 하는 법아까 View > Tool Windows > Git를 통해 인텔리 제이 하단에 뜬 브랜치 정보 우클릭 하고 push최종!!깃허브 화면 리프래쉬 해보면 프로젝트 올라감을 확인 가능엔티티 추출하기데이터베이스 설계한 내용을 토대로 jpa 엔티티 규격에 맞게 엔티티를 설계 했다.이 내용은 기본적인 jpa지식이 탑재된 내용이라 이론 정리는 생략하였다.미션깃 프로젝트 생성하기앞선 과정을 통해 깃레포트지로리를 작성했습니다.테이블 설계하기1:N 관계의 erp 시스템에 대한 편성된 예산에 대하여 지출하는 프로세스를 설계했습니다. 1주차 회고Keep (만족했고, 앞으로도 지속하고 싶은 부분)기초베이스가 역시 중요하다는 생각이 들었다. 개발을 하다보면 누군가는 되게 짧은 시간에 배우고 잘 하는 사람을 볼 수 있다. 그럴 떄 조급함을 느끼곤 했는데 그 사람의 과거 인생을 봐볼 필요가 있다. 짧은 시간이 단 3개월이라고 치면 그 사람은 짧은 시간 만에 배운게 아닌 지난 몇 년의 경험에 3개월의 지식을 얹었을 거라는 것이다. 개발은 3개월 배웠겠지만 개발자적인 사고방식을 10년했을 수도 있다는 것. 결국 이러한 기초지식이 모여서 나의 체급을 올려야 하는 점을 배운 부분에 만족한다. 전체적인 설계 및 개발 지식을 더 단단하게 배운 거 같아 벌써 앞으로의 여정이 기대됩니다.Problem (아쉬웠던 점)코틀린이라는 언어가 처음이라 다소 익숙하지 않은 문법들이 있다. 결국 자바와 하고 싶은 게 똑같다 보니 이해하는데 어려움이 있지는 않지만 코틀린 특유의 문법을 좀 더 깊게 이해하고 싶다는 생각이 들었다.Try (다음에 시도해볼 점)테이블 구조를 보고 올바른 테이블 설계인지 아닌지를 고민해보는 시간을 가지려고 한다. 결국 테이블 설계는 엔티티 설계에 영향을 주게 되고 프로젝트 전체의 흐름에 영향을 주다보니 중요한 요소인 거 같다.

백엔드코틀린워밍업클럽3기백엔드프로젝트

언니복이

인프런 워밍업 클럽 3기 백엔드 스터디

프로젝트에 필요한 상수는 어떻게 관리할까?자바 코드에 직접 넣기같은 값을 여러 클래스에서 사용한다면 값이 수정될 때마다 모든 클래스에서 값을 찾아 바꿔줘야 할까?개발 서버와 운영 서버에서 다른 상수 값을 쓰고 싶다면?스프링 Profile과 application.yml스프링은 애플리케이션의 Profile을 정의할 수 있는 기능을 제공한다.실행 시 환경 변수로 정의 가능한다.따로 정의되지 않고 실행되면 default로 설정된다.No active profile set, falling back to 1 default profile: "default" application-{Profile} 형식으로 yml 또는 properties 파일을 생성하면 Profile에 따라 상수 값 설정 가능하다. 소스 코드상에서는 Enviromnent를 이용해 키로 값을 가져올 수 있다.환경별로 세팅해주기~git status :No commits yet, Untracked files 추적하지 않는 파일들도 보여줌https://www.toptal.com/developers/gitignore/ 사이트에 가면 gitgnore이 만들어짐  thymeleafhtml 엔진에 데이터를 넣어 동적으로 움직이게 해줌데이터베이스에서 가져온 데이터를 model에 넣어주고 어떤 템플릿을 쓸 건지 해서 템플릿 + 데이터가 된 html 최종을 만들어줌브라우저에서 html에 그려줌Validation어노테이션을 클라이언트에서 들어오는 값 검증문제가 생긴다면setting > grale > gradle jvm을 다시 다운 받자 타입datetime : 날짜와 시간을 같이 가지고 있는 자료형 컬럼명변경 사항을 추적하기 위함created_date_time : 메타 데이터updated_date_time : 메타 데이터 name을 기반으로 github 링크 라던지, 부트스트랩 아이콘를 보여줌 experience : experience_detail1: N으로 묶인 테이블project_skill : project skill은 다 대 다 관계로 매핑해주는 테이블http_interface : 사용자가 요청하는 테이블 확인 할 수 있음 domainconfiguration : 암호화constant : 도메인 패키지에서 사용하는 함수들entity : 데이터 베이스 테이블에 상응하는 객체repository : entity 별로 C/R/U/D 작업하는 것 들어감 presentation : domin이랑 합치면 하나의 독립된 프로젝트로 볼 수 있음controllerdto : 화면에서 필요하는 데이터들을 따로 묶음interceptor : 컨트롤러까지 요청 들어가기 전 모든 컨트롤러에 대해 공통 처리를 해주는 class, 각 화면을 조회할 때 요청에 대한 정보를 따로 db에 저장하는 기능 개발repository : 데이터 베이스와 직접 상호 작용 x 도메인 repository 레이어에서 필요로 하는 데이터를 중간에서 매핑해주는 역할service adminadvice : 예외 처리data : api 응답 공통 포맷, 입력 폼 정보, 테이블 정보를 담는 데이터 클래스exception : admin 페이지의 예외interceptor : 화면에서 보여지는 사이드바를 초기화하는 interceptorsecurity : 로그인 관련된 것들context : 만들 테이블, 확장성 있게achievementcontrollerserviceformdashboardexperienceintroductionlinkprojectskill [이론] JPA란JPA는 ORM(Obeject Relational Mapping) 기술이다.건물을 짓는 설계도로 건물을 올리게 되면 3D로 나오게 되는 것을 모델링이라고 한다.모델링 한다는 것은 추상화적인 개념을 현실세계에 구체화하는 것을 말한다.자바가 가지고 있는 데이터 타입과 데이터베이스가 가지고 있는 데이터 타입은 다르다. class를 통해서 데이터베이스에 있는 테이블을 모델링해야 한다.원래대로라면, 첫 번째로는 DB 테이블을 만들고 2번째로 자바세상에 모델링한다. ⇒ TRM(Table Relational Mapping)class Team{ int id; String name; String year; } 하지만, JPA경우 첫 번째로 자바에서 코드를 작성한 것인 클래스를 만들어서 두 번째로 데이터베이스 테이블을 자동으로 생성 수 있다. 이때 필요한 것이 인터페이스이다.ORM이란?Object Relational Mapping의 약어로, 객체 관계 매핑이라고 번역됨개발자가 직접 쿼리를 작성하는 과정이 생략되어 생산성이 향상됨데이터를 객체지향적인 관점에서 접근할 수 있게 한다.구체적인 DBMS에 대한 의존성이 줄어듦.단점JPA로 데이터베이스를 정확히 다루려면 충분한 학습이 필요성능이 악화되거나, 의도하지 않은 데이터베이스 수정이 발생할 수 있다.ORM만으로 원하는 모든 기능을 구현하기엔 한계가 있다.불가피하게 구체적인 DBMS에 의존하는 네이티브 쿼리를 작성해야 할 수 있다.JPA를 사용하기 위해 꼭 알아야하는 트랜잭션정의여러 개의 데이터베이스 작업을 하나로 묶어주는 논리적인 단위다 같이 안되거나 다 같이 되거나 => 트랜잭션영속성 컨텍스트영속성이란데이터 ⇒ 영구적 저장(파일시스템 X, DB O)컨텍스트란?(Context)Context란 대상의 모든 정보를 가지고 있는 것개발에서 컨텍스트 개념은 조금 애매하다. 이렇게 이해하면 좋다고 한다. 길동이가 영숙이에게 난 영숙이 너의 모든 컨텍스트를 가지고 있어 = 영숙이의 모든 것을 알고 있다.Context를 넘겨준다. = 보고가 길동이에게 영숙이의 Context(모든 정보)를 넘겨영속성 컨텍스트란?JPA에서 엔티티를 관리하는 임시 메모리, 버퍼와 같은 개념자바가 데이터베이스를 저장해야 하는 모든 데이터를 아는 것이 영속성 컨텍스트자바에 있는 동물 데이터를 영속성 컨텍스트에 넣고 나서 DB에도 저장 후 영속성 컨텍스트에서 삭제를 하면 동기화가 되어 있기에 DB에서도 삭제가 된다.일단 자바는 1. 영속성 컨텍스트에 먼저 요청을 한다. 2. 영속성 컨텍스트에 데이터가 없기에 DB에 요청 한다. 3. DB에서 가져와 자바 object로 영속성 컨텍스트에 저장한다. 4. 자바에 과일데이터를 준다.일단 자바는 1. 영속성 컨텍스트에 먼저 요청을 한다. 2. 영속성 컨텍스트에 데이터가 없기에 DB에 요청 한다. 3. DB에서 가져와 자바 object로 영속성 컨텍스트에 저장한다. 4. 자바에 과일데이터를 준다.데이터 베이스에 있는 데이터를 select해서 가져오고 update하는 등 일련의 모든 정보를 영속성 컨텍스트를 통해 확인 할 수 있다. 자바가 데이터베이스에 저장해야 하는 모든 메타 데이터 정보들을 영속성 컨텍스트가 가지고 있다. java에서 과일 데이터를 딸기로 바꾸면..영속성 컨텍스트의 과일데이터도 딸기로 바뀌고데이터베이스에 commit해서 밀어넣으면 원래 셋은 같은 데이터 인데 3번은 사과로 되어 있어 딸기로 바꾸기위해 update가 자동으로 일어난다.데이터베이스 정의(위키피디아) 여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 데이터의 집합이다.이론적으로 데이터의 집합을 의미한다. 엑셀에 표로 정리된 학생부, 입출금 내역 등도 데이터베이스라고 할 수 있다. 하지만 일반적으로웹 개발에서 데이터베이스라고 하면 DBMS를 의미하는 경우가 많다.관계를 꼼꼼히 따져보는 것이 좋다 특히 1:1, 1:N, N:M 등의 관계가 중요하다대표적인 관계형 DBMS(RDBMS)Oracle Database오라클 사에서 만든 데이터베이스입니다. 막강한 성능과 안정성이 장점이지만 유료라는 단점이 있다.MySQL오픈소스로 시작했지만 현재는 오라클 소유PostgreSQL꾸준히 점유율이 올라가는 오픈소스 데이터베이스비관계형 데이터베이스? NoSQL?관계형 데이터베이스를 제외한 모든 종류의 데이터베이스를 비관계형 데이터베이스라고 부른다. 키-값형, 문서형 등이 있다.대표적인 비관계형 DBMSMongoDB문서형 데이터베이스데이터를 비정형적으로 저장할 수 있다.RedisKey-Value 스토어 데이터베이스캐시 용도로 주로 사용 [이론] HTTP와 REST API복잡한 비즈니스에서는 모든 기능을 REST를 준수하며 개발하기가 매우 어렵습니다. 가능한 REST 규칙을 따르되, 불가피한 부분에서 개발자가 참고할 수 있는 팀의 컨벤션을 만들어두는 것이 좋다.구글 API 디자인 가이드https://cloud.google.com/apis/design?hl=ko 클라이언트에서 서버로 데이터를 전달하는 방법Query Paratmeter쿼리 스트링이라고도 부른다. 스프링에서는 컨트롤러에 @RequestParam 어노테이션으로 간편하게 가져올 수 있다.HTTP Request Body스프링에서는 컨트롤러에 @RequestBody 어노테이션으로 간편하게 가져올 수 있다.Path Variable경로 변수라고도 한다. URL에 접근하고자 하는 자원의 식별자를 표현한다. 스프링에서는 @PathVariable 어노테이션으로 간편하게 가져올 수 있다get으로 모든 로드맵 가져옴 : https://www.inflearn.com/roadmaps뒤에 숫자를 붙여 id를 가져옴으로 특정 페이지를 가지고 옴https://www.inflearn.com/roadmaps?terms=5&page=1에서 terms=5&page=1가 쿼리 파라미터임[이론] 웹 프레임워크와 Spring웹 프레임워크프레임워크를 사용한다면 포크레인, 덤프트럭을 사용한다고 할 수 있습니다.프레임워크도 시간이 지남에 따라 발전하며 점점 사용성이 좋아진다.프레임워크? 라이브러리?프레임워크와 라이브러리를 구분하는 키는 ‘제어의 주도권’비유하면 프레임워크는 DIY 가구 키트라고 할 수 있다. 라이브러리는 가구를 만들기 위한 망치와 같은 공구, 또는 그런 공구들을 모아둔 공구 상자라 할 수 있습니다. 사용자가 주도권을 가지고 원하는 것을 만들 수 있다.물론 가구 키트를 만들며 망치를 사용할 수 있듯이, 프레임워크 안에서도 라이브러리를 사용할 수 있다.Spring FrameworkJava 기반의 웹 프레임워크이다.MVC 패턴(Model-View-Controller)MVC 패턴은 소프트웨어 아키텍처 디자인 패턴요청의 처리(비즈니스 로직), 데이터, 화면 간의 결합도를 낮추면서 유지보수를 용이Model: 데이터를 담는다. Controller는 데이터를 넣고, Views는 데이터를 꺼내올 수 있다.View: 사용자에게 보여지는 화면을 담당한다. Model에서 데이터를 꺼내올 수 있다.Controller: 요청을 받아 작업을 수행한다. 작업의 결과 데이터를 Model에 넣을 수 있다.레이어드 아키텍처(Controller-Service-Repository)Presentation(Controller): 클라이언트가 요청할 수 있는 인터페이스를 정의한다. 전달받은 데이터를 검증하고, Service의 메소드(처리 로직)을 호출한다.Business(Service): 목적에 맞게 데이터를 처리한다. 일반적으로 Repository의 다양한 데이터베이스 처리 메소드를 호출하여 저장,수정, 조회, 삭제 등을 수행한다.Data Access(Repository): 데이터베이스에 접근하여 작업을 요청한다. 다양한 데이터베이스 처리 방법을 제공하면 여러 서비스에서 공통적으로 사용할 수 있다.스프링 Bean과 의존성 주입(Dependency Injection)스프링에서 관리되는 객체, 즉 자바 클래스의 인스턴스를 의미제어의 역전(Inversion of Control), 줄여서 IoC이란?스프링 Bean으로 지정된 클래스는 개발자가 직접 인스턴스를 생성, 관리하지 않고 스프링 컨테이너가 주체가 됨Bean에서 다른 Bean을 사용하는 경우, 즉 의존하는 경우에 스프링 컨테이너에서 의존성을 주입해준다.의존성 주입이란?의존성 주입이란 한 객체가 사용하는 다른 객체를 객체 내부에서 직접 만들지 않고, 외부에서 주입받아 사용하는 방법스프링이 실행될때 컴포넌트 스캔이란 과정을 거쳐 Bean으로 지정된 클래스들의 객체를 모두 만들둔다.이 과정에서 한 Bean이 사용하는 다른 Bean이있다면 그 Bean을 먼저 생성⭐ IoC(역전의 제어) ⇒ 주로 주도권 스프링객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미컴포넌트 의존관계 설정(Component dependency resoulution), 설정(Configuration) 및 생명주기(LifeCycle)을 해결하기 위한 디자인 패턴(Design Pattern)이다.스프링이 직접 만든다. 스캔하여 heap 메모리에 올려주고 스프링이 직접 관리(++ 추가)⭐ IoC 컨테이너컨테이너?란 컨테이너는 보통 객체의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것스프링 프레임워크도 객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너가 있는데,그것이 바로 IoC 컨테이너(=스프링 컨테이너)인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해주기 때문에 객체 관리 주체가 프레임워크(Container)가 되기 때문에 개발자는 로직에 집중할 수 있다는 장점이 있다.IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다.개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡긴다.개발자는 비즈니스 로직에 집중할 수 있다.객체 생성 코드가 없으므로 TDD가 용이하다.POJO(Plain Old Java Object)란? 주로 특정 자바 모델이나 기능, 프레임워크를 따르지 않는 Java Object를 지칭한다. Java Bean 객체가 대표적이다. 간단하게 getter / setter를 생각하면 될 것 같다. 생성자 주입 권장런타임에 수정자를 호출해서 의존성이 바뀌는 것을 방지할 수 있다.순환참조 시 컴파일 오류가 발생해서 런타임 단계에서 메소드가 서로 호출하는 스택오버플로우 에러를 방지할 수 있다.의존하는 Bean이 누락되면 컴파일 오류가 발생하기 때문에 런타임에서 NullPointerException을 방지할 수 있다.수정자나 필드는 null이 넘어갈 수 있음[이론] 웹 서비스를 구성하는 요소클라이언트요청하는 주체브라우저서버응답하는 주체데이터베이스에서 데이터의 삽입, 수정, 조회, 삭제(CRUD)한 뒤 결과를 클라이언트에 반환하는 작업대부분의 규모 있는 서비스에서는 동일한 작업을 수행하는 여러 대의 컴퓨터, 서로 다른 작업을 수행하는 컴퓨터 등으로 서버 컴퓨터 집합(클러스터)을 구성3. 데이터베이스데이터의 집합을 저장하고 관리하는 역할을 하는 프로그램을 데이터베이스 관리 시스템브라우저를 주소창에 입력하면 어떤일이 일어날까?  

백엔드인프런강의백엔드코틀린나만의포폴사이트

보키

[인프런 워밍업 클럽 3기 - BE/Project] 1주차 회고 발자국 🐾

https://code-boki.tistory.com/231먼저, 회고글을 작성하기 전에 회고법으로 사용할 수 있는 전략에 대해서 예전에 작성한 글이 있어서 다시 한번 공유해본다.종종 이런것들을 프레임워크라고 부르기도 한다.디자인 프레임워크, 회고 프레임워크, 백엔드 프레임워크...정해진 틀에 맞춰서 진행하는 것이다.나는 이 중 회고에 사용되는 KPT 회고 프레임워크를 선택해서 이번 한 주의 회고록을 작성해봤다.Keep(만족, 지속하고 싶은 부분)맨 처음부터 섹션3까지 쭉 들었다.웹 서비스를 구성하는 요소: Client, Server, Database브라우저에 주소창을 입력하면 발생하는 일: DNS, IP Resolution, Gateway, Server, DBMS웹 프레임워크/라이브러리Spring Framework: MVC Pattern책임분리(Segregation Of Principle): Layered Architecure(3-tier)스프링 Bean & DI(의존성 주입): 생성자, 수정자, 필드 방식HTTP, Request, ResponseHTTP Method: GET, POST, PUT, PATCH, DELETEHTTP Status Code: 2xx, 3xx, 4xx, 5xxREST API: 자원, 행위, HATEOASSend Data Client to Server: Query Parameter(Query String), Path Variable, Request BodyDBMS: RDB / NoSQLRDB Key: PK(Primary Key), FK(Foreign Key), Candidate KeyRDBMS: Oracle, MySQL, PostgreSQLNoSQL Management System: MongoDB(Document), Redis(Key/Value)JPA/ORMTransaction, Commit, RollbackPersistence Context(영속성 컨텍스트): JPA's 버퍼/캐싱 레이어/임시 메모리호흡이 조금 빠르긴 했지만, 웹 백엔드 개발에 대한 전반적인 지식에 대해서 배울 수 있는 요약본 강의였다.이대로 쭉 마지막 강의까지 듣고 미션도 쭉죽 완성해 나가길 기대한다!Problem(부족, 아쉬웠던 부분)사실 Backend개발에 앞서 Web이란것도 HTTP 0.9/1/1.1/2.0 프로토콜 버전.. TCP/UDP, 네트워크 OSI 7계층, TCP/IP 4계층, 스위치/허브/라우터 등등 알아야 할 것들도 많고Spring쪽으로 넘어오면 Servlet(Java -> Jakarta) 버전부터 한때 JSP(Java Servlet Page)의 출현으로 인한 SSR 발전부터 현재의 CSR부터 다시 SSR(Next.js)등의 개발세계의 히스토리도 풀어줬으면 어땠을까 하는 생각이 들었다.하지만, 비전공자나 코딩이 처음인 사람들 입장에서는 How it Works보다는 How to Use가 중요하니까 이런 포맷으로 준비한게 아니실까 싶다. 그리고 내가 처음 코딩을 배우는 입장이였다면, 위에 나온 내용들이 개발 지식에는 꼭 필요한 것이라 생각해서 잘 구성한 것 같다고도 생각이 들었다.+ Java나 Kotlin 언어적인 것에 대한 내용도 아주 살짝 있었으면 좋았을 것 같았다!Try(도전, P에 대한 해결책 등으로 다음번에 보완하거나 시도할 부분)나름대로 잘 해 나가고 있다고 생각한다. 개인 프로젝트와 더불어서, 강의에 나온 것들 중에서 내가 원래 했던 백엔드 개발에서 놓쳤거나 추가하고 싶은 부분이 있다면 보완해보기도 하고 강의 프로젝트도 차근차근 함께 만들어나가봐야겠다!

백엔드인프런워밍업클럽스터디회고코틀린스프링백엔드

[인프런 워밍업클럽 백엔드 3기] 1주차 발자국

💚코프링 스터디: 자바만 쓰는 회사에 재직중이다 보니 스프링을 점점 까먹어 가는게 느껴졌다. 그러던 참에 인프런에 코프링 스터디가 열린다 하여 바로 신청했다.. 하기 잘한것같다. 💻강의 수강<1주차 강의 진도>[이론] 스프링, 프레임워크, HTTP, REST API, 데이터베이스, JPA에 대한 기초 설명   면접 시즌때 열심히 공부했었던 내용이었는데 오랜만에 들으니 또 새로운 기분으로 듣게 된다. 반성합니다.[설계] 패키지 구조, 테이블 설계 [환경세팅] 개발 환경 세팅, 프로젝트 생성(Spring Initializer), GitHub 자바 21을 써보기 위해 최신 스프링 중 가장 안정적이라는 스프링 3.4.3을 선택했다[개발] 기본 클래스 생성, 엔티티 클래스 완성 사실 이번 스터디로 코틀린을 처음 써보는데, 자바랑 다른 점이 생각보다 훨씬 많아 아직 익숙해지는중이다. JPA 기능들도 거진 생각이 안나서 원투매니 열심히 뜯어보는중. 📖복습어노테이션 @PostConstruct이란?@Component, @Service, @Repository 같은 Spring Bean으로 관리되는 객체에서 사용 가능 의존성 주입이 완료된 후 실행됨애플리케이션이 시작될 때 한 번만 실행됨 주로 초기 설정, 데이터 로딩, 캐시 초기화 등에 사용됨  💟미션과제 주제로는, 멘토님의 예시 중에도 있으면서 요즘 내가 대학교를 새롭게 다니게 되며 거의 매일매일 수시로 쓰고있는 '학사 시스템'을 작게로나마 직접 설계해보면 좋지 않을까 해서 고르게 됐다. <3/6 목 미션1>깃허브 레포지토리에 프로젝트 올리기본 강의와 동일하게 세팅했다.깃허브 주소 : siirro/academic-info-system<3/7 금 미션2>테이블 설계우선 가장 기본적인 학생과 학과 테이블을 만들었고, 그 다음으론 이 시스템에 수강신청 API를 만들어보면 좋을 것 같아 강의 테이블을 만들었다.학생과 학과는 다대다의 관계이므로 사이에 소속학과 테이블을 만들었고, 학생과 강의 역시 다대다 관계 이므로 사이에 수강강의 테이블을 만들어 다대다 관계를 해결하였다.교수 테이블은 강의 테이블에는 교수의 정보도 있다 보니, 교수의 정보 또한 보다 명확하게 관리하는 편이 좋을 것 같아 추가로 만들었다.  

백엔드스프링부트코틀린인프런백엔드스터디

ssun

[인프런 워밍업 클럽 2기] 백엔드 프로젝트(Kotlin, Spring) 1주차 👣

📌 강의 정보입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기(정보근) 📌 강의 수강  [웹 서비스를 구성하는 요소]클라이언트서버데이터베이스DNS 서버와 IP 주소[웹 프레임워크와 Spring]프레임워크Java, Kotlin : SpringJavaScript, TypeScript : Express.js, Nest.jsMVC 패턴(Model-View-Controller스프링 Bean과 의존성주입(Dependency Injection)생성자(constructor)수정자(setter)필드(field)[HTTP와 REST API]RequestResponseHTTP 요청 메서드GET : READPOST : CREATEPUT, PATCH : UPDATEDELETEHTTP 상태 코드200 : OK300 : Multiple Choices400 : Bad Request500 : Internal Server ErrorJSON : JavaScript Object Notation[JPA]ORM트랜잭션영속성 컨텍스트[Git과 Github]CommitRollbackBranchMergeConflictRepositoryPush.gitignorehttps://www.toptal.com/developers/gitignore[Spring boot initializr]Spring Initializr 📌 미션💡 [미션1] 테이블 설계하기팀 프로젝트에서 테이블 설계를 할 때가 생각났다. 테이블 설계를 하는 일은 재미있으면서도 데이터를 어떻게 저장하는 게 효율적일까?라는 고민들에 머리 아픈 시간을 보내기도 한다. 하지만 고민보다는 고! 설계 시 아무리 고민해도 마음에 안 든다면 일단 내가 생각한 대로 진행하고 하다가 오! 이렇게 하는 거 별로인데? 하면 바꾸면 된다.😉 (개인 프로젝트여서 가능한 생각..)내가 미션 테이블을 설계하면서 고민한 부분은 북마크 테이블이었다. 북마크 레시피 글과 밀크티샵 글의 북마크를 하나의 북마크 테이블에 저장하려고 했다. 카테고리에 레시피나 밀크티샵을 구분을 하고 카테고리 번호로 해당 게시글의 번호를 저장해 그 두 개의 컬럼을 이용해서 구분을 하고 싶어서 아래 사진처럼 설계를 했다. 하지만 이 북마크 부분은 아직 마음에 들지 않아서 프로젝트를 하면서 수정이 필요한 부분이라면 바로 변경할 예정이다. 또 하나 수정할 점은 밀크티샵의 주소 컬럼이다. 일단 프로젝트 초기에는 데이터를 저장한다는 생각에만 집중해서 하나의 컬럼으로 두고 좀 더 프로젝트를 구체화할 때 주소 컬럼을 상세 주소 컬럼으로 더 나눠서 작업할 예정이다. 💡 [미션2] 깃허브 리포지토리에 프로젝트 올리기~ 즐거운 README 꾸미기 ~ 어째서 밀크티 이모지가 없는 거야?.. 버블티 이모지만 나온다…😭 💡 ERD 설계 📌 회고 이번 1주 차는 정말 정말 바빴다. 시간 쪼개기를 하면서 “내가 버리는 시간이 이렇게 많았다고?” 와 “아 너무 에너지를 많이 썼다”라는 두 개의 생각이 공존하는 일주일이었다.이번 일주일 동안 이론에서 배운 것을 아직 다 내 것으로 만들지 못했다. 물론! 한 번만 보고는 절대 안 된다는 것을 아니까 차근차근 하자. 라고 마음먹긴 했지만 마음이 급하다… 다음 주까지는 바쁠 것 같은데 화이팅 해보자. 역시 실습을 즐거워.. 프로젝트 미리 보기를 해서 어떤 페이지들로 구성이 되는지 결과를 미리 보니까 빨리 완성해서 이곳저곳 꾸미고 구성을 어떻게 해볼까 계속 아이디어가 떠오른다. 포트폴리오를 완성하는 날까지 아자! 💪 

백엔드인프런워밍업코틀린

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주일 압축으로 해낸 것처럼 배운것도 정말 많았습니다. 앞으로도 이렇게 천천히 노력해가면서 꼭 완주를 해내겠다는 다짐을 하게된 한 주였습니다. 

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

채널톡 아이콘