Spring 시작과 페어프로그래밍 (2024.04.29)

YJ·2024년 4월 29일
post-thumbnail

블로그 작성법
목표 > 공부한 내용 > 얻었고, 앞으로 이걸 해봐야지 적기

✋ 수업 목표

  • IoC, DI에 대한 개념을 배우자.
  • Spring Bean, Spring Container를 이해하자.

🤔 공부한 내용

JDK

  • JVM은 프로그램을 실행하는 자바 플랫폼 구성요소다.
  • JRE는 JVM을 생성하는 디스크 상의 부분이다.
  • JDK는 개발자들이 JVM과 JRE에 의해 실행되고 구동될 수 있는 자바 프로그램을 생성할 수 있게 해준다.

참조 자료
https://openjdk.org/

MVC

View
회원가입 버튼을 누른다.
POST /signup API가 호출 된다.


Controller
API가 호출되는 부분
API가 호출되면, Controller의 메소드가 호출 되는 것이다.
API 호출 => Controller의 메소드 호출된다.
Controller는 Service에게 일을 시키는 것.
(Service야 사용자가 일 해오래.)

Model
1. 데이터를 주면서, 이거 좀 찾아주세요
2. 데이터를 주지도 않으면서, 이거 좀 찾아주세요

Service
데이터를 연산하는 부분.
비즈니스 로직을 담당하는 클래스이다.
(Repository 나 일 해야되는데 데이터 좀 줘봐)

Repository
데이터를 관리하는 부분.
비즈니스 로직을 처리하기 위해 DB랑 얘기할 친구
(DB야 데이터 줘봐. Service야 데이터 가져가)

Main의 종속성 제거


현재 위 코드를 보면
모든 객체 생성이 main 메서드 안에서 진행된다.
객체 생성을 담당하는 클래스를 따로 만들어서 관리할 수 있을까?

지금 문제
객체를 직접 만드는게 문제이다.

MemberRepository memberRepository
= 객체 생성 담당 객체.emeberRepo주세요();

MemberService memberService
= 객체 생성 담당 객체.memberService주세요();

위 방식으로 클래스 분리할 수 있을까?

디자인 패턴

싱글톤 에 대해 배워보자.

이러한 문제에서 싱글톤은 시작되었다.
계속 새로운 인스턴스를 생성

참고 자료
https://refactoring.guru/ko/design-patterns/catalog

페어프로그래밍

이전 페어프로그래밍 회고
https://velog.io/@yoojoon/2024.04.05

코드

import java.util.Scanner;

public class SelectionSort {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] strArr  = sc.nextLine().split(" ");

        int n = strArr.length;
        int[] arr = new int[strArr.length];
        for(int i=0; i<n; i++){
            arr[i] = Integer.parseInt(strArr[i]);
        }

        for(int i=0; i<n-1; i++){
            int idx = i;
            for(int j=i+1; j<n; j++){
                if(arr[idx] > arr[j]){
                    idx = j;
                }
            }
            swap(arr, i, idx);
        }

        for(int x: arr){
            System.out.print(x + " ");
        }
    }

    public static void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
}

좋았던 점

몰랐던 Java 문법과 개념들을 옆에 분에게 배울 수 있어서 좋았고, 말로 설명하는 연습을 진행할 수 있어서 좋았다.
또한, 오랜만에 선택 정렬을 구현하였는데 과거에 배웠던 기억이 새록새록 떠올랐던 것 같다.
개발자가 되기 전에 나의 코드를 설명하는 시간을 갖을 수 있어서 좋았다.
앞으로도 페어프로그래밍을 통해 다른 사람에게 나의 코드에 대해 설명하는 시간을 가지면 좋을 것 같다.

아쉬웠던 점

저번과 마찬 가지로 네비게이터 역할이 어려운 것 같다. 선택 정렬을 너무 오랜만에 보아 이해하는데 급급하였고, 개발의 흐름을 말로 풀어서 설명하는 것이 쉽지 않은 것 같다.
다음에 페어프로그래밍을 진행할 때는 내용을 조금 더 숙지하고, 조금 더 쉽게 드라이버에게 설명하도록 노력해야 할 것 같다.

02. 스프링의 주요 원리 - 개념

어서와 스프링은 처음이지?

  • J2EE Design and Development
    expert one-on-one

EJB(Enterprise Java Bean)

큰 시스템에서 자바를 가지고 만든 빈

EJB는 Spring 전 시대

Spring에 객체 관리 를 다 떠 맡긴다.

Spring Framework Runtime

여기서 제일 중요해 보이는 단어가 무엇일까?
Core Container

Core의 주요 원리에 대해 알아보자.

Library란?
선배 개발자의 코드를 빌려 쓰는 것

Framework란?
하나의 틀 안에서 특정 서비스를 완성할 수 있는 것.

Spring은 Full Stack Framework 이다.

문제는 이렇게 많은 것들을 다 환경 설정 할 수 있을까?
그래서 등장한 개념이 Spring Boot 이다.

Spring Boot는 사용자 입장에서 환경 설정을 자동으로 해준다.

Web Server와 Web Application Server의 차이

Spring Boot와 Spring의 차이.

Spring Boot는 웹/WAS가 자동으로 내장되어 있다.
Spring은 별도로 웹/WAS를 설치해줘야 한다.

이제 Web Server와 WAS의 차이에 대해 알아보자.
Web Server는 정적 페이지를 담당하는 서버
WAS는 동적 페이지를 담당하는 서버

정적 페이지: 여러 유저가 들어갔을 때 모두 같은 정보를 페이지에서 보여는 페이지
동적 페이지: 대부분의 웹사이트 페이지로써 내가 원하는 페이지로 계속 바꿔주는 페이지

IoC, DI, Spring Bean, Spring Container

  • IoC(Inversion of Controller: 제어의 역전)
    여기서의 Inversion => 180도 상황이 뒤집혀진다. (정반대의 상황)
    A가 연필을 가지고 있고, B가 연필을 가지고 있지 않다.
    객체의 흐름을 제어한다.
    제가 가지고 있지 않고, Spring이 가지게 된다.
    객체에 대한 제어권을 내가 가지고 있었는데,
    Spring이 가지게 되었다.
  • DI(Dependency Injection)
    의존성 주입
    사용하는 것, 사용할 것
    객체 지향 세상에서 사용하는 것은 객체 밖에 없다.
    객체를 주입하는 것, 객체를 주입당하는 것, 객체를 의존하는 것

  • Spring Bean
    빈은 객체 라고 생각하자.
    객체가 돌아다니면서 일이 많은 객체를 이라고 하자.
    나를 관리할 수 있는 객체를 이라고 한다.
    스프링이 관리하는 자바 객체

  • Spring Container
    스프링 기준으로 객체가 여러 개로 뿌려져 있다.
    그러면, 객체를 관리하기 쉬울까?
    어떻게 쉽게 관리할 수 있을까?

객체를 관리할 을 하나를 만들자
안에 스프링 빈 을 담아서 관리하자.

객체 지향 세상에서 관리할 거는 객체 만 관리한다.
원래는 이 객체를 개발자만 관리를 하다가
이제 Spring에게 제어권을 줬다. 제어의 역전.
Spring이 제어권을 가진다.
이제 A 객체를 사용하려고 하면 어떻게 해야할까?
객체를 스프링 컨테이너에 넣어줘야 한다.

03. 스프링의 주요 원리 - 실습

스프링아, 이 객체 지금부터 니가 관리해 = 스프링아, 이 객체 스프링 빈으로 등록해줘

공공기관 표준프레임워크 사이트
https://www.egovframe.go.kr/home/sub.do?menuNo=9

JDK 버전 기준으로 표준 프레임워크 버전이 달라진다.

우리가 2. 버전을 버리고 3. 대로 갈 수 없는 이유이다.
공부하는데에는 3. 버전을 사용해도 무방하다.

2점대를 사용하고 싶을 경우
https://songacoding.tistory.com/137

start.spring.io

Jar: Was를 담아서 설치
War: Was 없이 설치

Java 버전
21,22는 아직 안정화가 된 것 같지 않음

Dependencies
사용할 것
선택이 가능하다.
프로젝트 중간중간에 마음대로 설치 가능하다.


RESTful하게 웹을 만들 수 있다.
MVC를 사용한다.

설치후 사용하는데 에러가 발생하였다.

해결 자료
https://velog.io/@nemo/spring-boot-java-error

방법
1. Java를 17버전으로 업데이트
2. Spring boot를 2.x 버전으로 선택하여 프로젝트 생성

인텔리제이 JDK 설정하는 방법
https://dev-emmababy.tistory.com/139

스프링 빈으로 등록하는 방법 2가지

1) @Component
어느 클래스 위에든 @Component를 붙여 놓으면
스프링 컨테이너에 들어간다.

2) @Configuration + @Bean

배달의 민족

요구사항 분석

  • 도메인을 분리
    : 시스템이 커서 유지보수하기 어려우므로

DDD(도메인 개발 기법)
1. 요구사항분석: 모든 용어
2. 유비쿼터스 언어

  1. '배달' 안에서 쪼갤 것
  • 사용자 입장
  • 관리자 입장

제일 초반에 배달의 민족이 어떻게 생겼을지 고민하고
요구 사항 분석

  1. 배달 내의 기능을 각각 묶어서 무슨 이름일 것 같다 고민

😉 앞으로 이걸 해봐야지

Spring 세상이 시작되었다. 오늘 배운 개념인 IoC, DI, Spring Bean, Spring Container에 대한 개념을 앞으로 적용해보고, 새로운 개발 기법인 DDD를 통해 기획을 진행해보고 싶다.

profile
dev

0개의 댓글