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

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

 

해당 글은 ‘입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기(정보근)’ 강의 를 수강하고 작성한 내용입니다.

https://www.inflearn.com/course/입문자-spring-boot-kotlin-포트폴리오/dashboard

📝 강의 내용 정리


[이론]

1. 웹서비스를 구성하는 요소

  • 클라이언트

    • 요청하는 주체 ex) 웹 브라우저들

  • 서버

    • 요청을 수행한 후 응답하는 주체

    • 일반적으로 데이터베이스에서 데이터의 삽입,수정,조회,삭제 한 뒤 결과를 클라이언트에 반환

  • 데이터베이스

    • 서버와 상호작용하는 데이터의 집합

    • 데이터의 집합을 저장하고 관리하는 역할을 하는 프로그램을 DBMS라 함

  • DNS 서버

    DNS서버에 도메인 주소를 보내면 해당 IP 주소를 찾아서 알려주는 방식

2. 웹 프레임워크와 Spring

  • 웹 프레임워크

    동적 웹 서비스 개발을 편리하게 만들어주는 도구, 공통적으로 요구되는 기능들을 보다 편리하게 사용할 수 있게함

    • 백엔드 웹 프레임워크 종류

      • Java, Kotlin: Spring

      • JavaScript, TypeScript: Express.js, Next.js

      • Python: Django

      • Ruby: Ruby On Rails

    • 프론트엔드

      • JavaScript: React, Angular, Vue.js

  • Spring Framework

    자바 기반의 웹 프레임워크로 웹 서버 갤바를 편리하게 모듈화 해놓음

  • MVC패턴

    • Model: 데이터를 담음. Controller는 데이터를 넣고, View는 데이터를 꺼내옴

    • View: 사용자에게 보여지는 화면을 담당

    • Controller: 요청을 받아 작업을 수행

    ⇒ 이 3개의 컴포넌트가 각각 독립된 기능을 담당하고 서로 상호작용하는 방식으로 구조를 잡은 디자인 패턴

  • 레이어드 아키텍쳐

    스프링 웹 개발 시 주로 레이어드 아키텍쳐를 기반으로 개발

    • Presentation(Controller)

      클라이언트가 요청할 수 있는 인터페이스, 전달받은 데이터를 검증 후 서비스의 메서드를 호출

    • Business(Service)

      목적에 맞게 데이터를 처리. 일반적으로 레포지토리의 데이터베이스 처리 메서드를 호출

    • Data Access(Repository)

      데이터베이스에 접근하여 작업을 요청

  • 스프링 Bean과 의존성 주입(Dependecy Injection)

    • 스프링 Bean

      스프링에서 관리되는 객체(= 인스턴스)를 의미. 스프링 Bean으로 지정된 클래스는 개발자가 직접 인스턴스를 생성, 관리하지 않고 스프링 컨테이너가 관리 → 이를 제어의 역전(IoC) 라고 함

    • 의존성 주입

      한 객체가 사용하는 다른 객체를 내부에서 직접 만들지 않고, 외부에서 주입받아 사용하는 방법. 스프링이 실행될 때 컴포넌트 스캔이라는 과정을 거쳐 Bean으로 지정된 클래스들의 객체를 모두 만들어 준 후 스프링이 관련 Bean들을 생성해줌

    • 스프링 부트의 의존성 주입 방법

      1. 생성자(권장)

        • 런타임에 수정자를 호출해서 의존성이 바뀌는것 방지

        • 순환참조 시 컴파일 오류를 발생해 런타임 중 스택오버플로우 방지

        • 의존하는 Bean이 누락되면 컴파일 오류 발생시켜 런타임 중 null 예외 방지

      2. 수정자

      3. 필드

3. HTTP와 REST API

  • HTTP정의

    네트워크로 통신하는 두 컴포넌트 간의 통신 규약

  • HTTP 요청/응답

    • Request

    • Response

  • HTTP 요청 메서드

    • GET: Read 작업 요청 시 사용, 브라우저 주소창은 항상 GET 메서드로 요청

    • POST: Create작업을 요청할 때 사용

    • PUT: Update 작업 요청 시 사용

    • PATCH: Update 작업 요청 시 사용

    • DELETE: Delete작업 요청 시 사용

  • HTTP 상태코드

    • 200: OK

      정상 처리

    • 300: Multiple Choices

      리다이렉션

    • 400: Bad Request

      클라이언트 오류

    • 500: Internal Server Error

      서버 오류

  • REST API

    HTTP 통신으로 동작하는 어플리케이션 기능을 정의하는 규칙

    • REST API 핵심

      • URL을 이용한 자원의 표현

      • HTTP 메서드를 이용한 행위의 표현

      • HATEOAS 준수

    ⇒ 복잡한 비즈니스에서는 모든 기능을 REST를 준수하며 개발하기 어렵기 때문에 가능한 규칙을 따르되, 불가피한 부분은 팀의 컨벤션의 따라 개발

  • 클라이언트에서 서버로 데이터를 전달하는 방법

    • Query Parameter

    • HTTP Request Body

    • Path Variable

4. 데이터베이스란

  • DBMS(DataBase Management System)

    데이터베이스를 저장하고 관리할 수 있는 응용 프로그램

    크게 관계형과 비관계형으로 나뉨

  • 관계형 데이터 베이스

    데이터를 행과 열로 이루어진 표의 형태로 저장

    가장 널리 쓰이는 데이터 베이스

    테이블의 속성 = 컬럼

    한 열의 데이터 = 레코드

    • 유일한 레코드를 식별할 수 있는 컬럼의 최소 조합을 후보키 라고 함

    • 후보키 중 대표로 지정한 것은 기본 키 라고 함

    두 테이블에서 하나의 레코드에 다른 테이블의 여러 레코드가 관계가 있으면 1:N 관계라 함

    필요에 따라 N:M 관계가 될 수 도있는데 이럴땐 중간에 맵핑 테이블로 관계를 풀어서 사용

  • 관계형 DBMS 종류

    • Oracle Database

    • MySQL

    • PostgreSQL

  • 비관계형 DBMS 종류

    • MongoDB

    • Redis

5. JPA란?

  • ORM

    객체지향 프로그래밍의 인스턴스와 관계형 데이터베이스를 매핑해주는 기술을 의미

    [장점]

    • 개발자가 직접 쿼리를 작성하는 과정이 생략되어 생산성이 향상됨

    • 데이터를 객체지향적 관점으로 접근 가능

    • 구체적인 DBMS에 대한 의존성이 낮아짐

    [단점]

    • 데이터를 정확히 다루기 위해 충분한 학습이 필요

    • ORM만으로 원하는 모든 기능을 구현하기에는 한계가 있음

  • 트랜잭션

    여러 개의 데이터베이스 작업을 하나로 묶어주는 논리적인 단위

    [대표적인 예시]

    두 계좌가 있고 이체를 시키는 경우 두 계좌 중 하나만 실행되면 안됨. 그래서 두 작업을 트랜잭션으로 묶어 모두 성공하고너 모두 실패하도록 보장해주는 것이 트랜잭션임

    • 커밋: 트랜잭션으로 묶인 모든 작업을 데이터베이스에 영구히 반영하는 작업

    • 롤백: 트랜잭션으로 묶인 모든 작업을 원상복구하는 작업

  • 영속성 컨텍스트

    어플리케이션의 로직과 데이터베이스 사이에 있는 임시 메모리

    JPA는 DB에 접근 전 영속성 컨텍스트를 거침

    [특징]

    • 1차 캐시: 조회한 데이터의 임시 저장소, SELECT문 수행 전 1차 캐시에 데이터가 있으면 쿼리를 수행하지 않음

    • 더티 체킹: 영속성 컨텍스트 내의 데이터에 변화가 있을 경우 자동으로 UPDATE문을 수행

    • 쓰기 지연: INSERT, UPDATE를 즉시 수행하지 않고 영속성 컨텍스트 내에 모아뒀다가 트랜잭션이 종료될 때 한 번에 수행

[실습]

이 부분은 실습 진행하면서 몰랐던 부분들 기록하는 정도

개발 환경 구성

평소에는 Oracle의 JDK를 주로 사용했었는데 해당 강의는 Azul JDK를 사용해서 진행한다. 기존에 있는 Oracle의 java 17과 충돌이 있진 않을까 걱정했는데 Zulu JDK도 잘 돌아가서 강의대로 진행하면 될 것 같다.

Git과 GitHub

  • .gitignore 설정

    손쉽게 gitignore파일 생성해주는 사이트

    <aside> 📎

    https://www.toptal.com/developers/gitignore

    </aside>

    이 사이트의 존재는 알고있었는데 사용법을 찾아보기 귀찮아서 그냥 다른 프로젝트에서 사용했던 ignore파일 복사해오거나 chatgpt한테 시켜서 ignore파일을 생성해왔다

    근데 강의에서 사용하는걸 보니 그냥 이거 쓰는게 더 편할 것 같다

    <사용법>

    1. 해당 사이트에 들어가 현재 프로젝트의 개발 환경만 키워드로 작성해주면 됨

      ex) Windows, Intellij+all, Kotlin, Gradle, Git

    2. 생성된 ignore 내용을 현재 프로젝트에 있는 .gitignore 파일 하단에 붙여넣기

    깃 몇 번 쓰다보면 ignore파일이 얼마나 중요한지 알게됨.. 초반에 귀찮다고 설정 안해놓으면 오만가지 파일이 다 깃에 올라가고 깃이 드러워져서 보기싫어짐..(이젠 꼬박꼬박 ignore 생성해서 추가해야지)

프로젝트 환경 변수 설정

datasource와 jpa 셋팅 과정 시 상수로 값을 넣어놔야하는데

이걸 자바 코드에 직접 넣게 되면

  • 같은 값을 여러 곳에서 사용 시 변경될 때마다 모든 위치의 값을 바꿔줘야함

  • 개발 서버와 운영 서버에서 다른 상수 값을 쓰고 싶을때 빌드할 때마다 값 변경해줘야함

<aside> 💡

환경변수: 환경 마다 바뀌는 값

</aside>

⇒ 번거로움.

스프링 Profile과 application.yml

image.png

  • 스프링에서 애플리케이션의 Profile을 정의할 수 있는 기능을 제공함

  • 실행 시 환경 변수로 정의 가능

  • 따로 정의되지 않고 실행되면 default로 설정됨

    로그에 어떤 profile로 셋팅이 되었는지 나옴

    로그에 어떤 profile로 셋팅이 되었는지 나옴

  • application-{Profile}형식으로 yml 또는 properties파일을 생성하면 Profile에 따라 상수 값 설정 가능

  • 소스 코드에서는 enviornment를 이용해 키로 값을 가져올 수 있음

[파일 위치]

src/resources에 기본적으로 application.properties 파일이 생성됨

현재 강의에서는 두개의 셋팅 값 사용

  • application-default.yml(개발용)

  • application-docker.yml(배포용)

yaml파일 설명

spring:

이 안에 들어있는 값들은 spring에 대한 설정 값

jpa:

이 안에 들어있는 값들은 jpa에 대한 설정 값

  • show-sql: 로그에 sql문 보여줌

  • ddl-auto: create로 해놓으면 프로젝트 실행 시 모든 테이블을 create함(=즉 Run할 때마다 날라감). 초기 생성 외 평상시에는 none으로 놓으면 됨

  • format_sql: 값이 true면 로그에 찍히는 sql문 줄 맞춰서 출력

datasource:

사용할 DB 정보(DB url, 계정, 비번 등..)

h2:

h2사용시엔 h2콘솔을 사용해야 해서 해당 값들 설정

미션


미션을 진행할 프로젝트 주제는 간단한 커뮤니티 페이지를 만들 생각이다.

아직 미션을 수행하진 않아서 회고를 적을 건 없지만 이번주 미션은 깃 레포지토리 생성과 테이블 설계가 다여서 많은 시간이 소요될 것 같지는 않다.

대충은 테이블을 어떻게 생성할지 구상만 해놓은 상태..

📅1주차 회고


이번주는 이론 관련 강의가 주 였다. 아예 모르던 내용들은 아니라서 간단한 개념 정리 느낌으로 수강하였다. 용어들이 익숙은 하지만 아직 정확하게 숙지된건 아니라 틈틈히 복습하면서 익히는게 좋을 것 같다는 생각이 들었다.

실습은 아직 엔티티 생성까지만 다뤘는데, 자바가 아닌 코틀린을 사용하다보니 아직은 어색한 부분들이 있는 것 같다(문법 적으로). 아직까지는 강의를 보면서 따라 치는 정도인데 이번 강의를 들으면서 코틀린 기본 문법들을 익혀야겠다는 생각이 들었다.

댓글을 작성해보세요.

채널톡 아이콘