Spring 교육 1일차

BS_Lee·2023년 10월 15일
0

Spring 교육일지

목록 보기
1/3

10/12

Spring을 왜 배우는가?

spring은 자바로 이루어진 개발환경인데 현재 한국에서는 정부표준 프레임워크에 해당된다. 스타트업부터 대기업까지 거의 대부분 사용하고 있기 때문에 한국에서 개발자로 취업하기 위해서는 spring을 배워야 한다고 생각한다. 뭐 다른 언어를 배워서 개발을 하는 곳도 있지만 채용 사이트만 봐도 spring개발자 모집이 더 많은 것을 눈으로 확인 할 수 있었다.

Spring MVC와 Spring Boot의 차이?

  • Spring MVC
  • Spring Boot

spring MVC같은경우에는 직접적으로 환경을 셋팅해야된다. spring boot같은 경우에는 어노테이션@만 명시해준다면 알아서 컨트롤러가 다 처리해준다. 이 뿐만 아니라 spring MVC에서는 서버가 내장이 되어 있지않기 때문에 직접 깔아서 설치를 해줘야된다.

수업시간에 들은 얘기지만 대기업이나 중소기업에서는 보통 Spring MVC를 많이 사용하고 스타트업에서는 Spring Boot를 많이 쓴다고 한다. 아무래도 Spring MVC같은 경우에는 개발자에게 요구사항이 많다 보니 코드가 길어져서 그런거같다.

Model1란?

Model1은 쉽게 말해서 jsp파일에서 로직처리(controller)와 화면(view)을 보여주는 역할을 한다. 간단한 페이지를 구현할 때는 Model1이 구현하기 좋겠지만, 조금이라도 규모가 커진다면 Model1의 단점이 바로 느껴진다. 한 페이지에 쇼핑몰의 메인 페이지를 구현한다면 코드의 복잡도가 높아질 것이고, 이렇게 되면 유지보수 용이성이 떨어지게 된다.

Model2란?

모든 페이지에 담겨있는 Model1하고 다르게 구성되어있다. Model2는 뷰, 컨트롤러, 모델로 분리되어 있다. 여기서 뷰는 jsp파일이고, 모델은 JavaBeans, 컨트롤러는 서블릿에 해당이 된다. Model1에 비해 좀 복잡해보이지만 로직이 분리되어 있어 유지보수도 용이할 뿐만 아니라 코드의 복잡도가 낮아진다. 하지만 Model1에 비해서는 서비스 흐름의 이해가 어렵기 때문에 자바코드와 Model2에 대한 흐름을 어느정도 알고 있어야 한다.

Model1와 Model2의 차이?

Model1Model2
클라이언트 요청JSP에서 해결Servlet을 통해 해결
유지보수성복잡함비교적 쉬움
페이지 구조단순함복잡함
페이지 접근직접요청Controller를 통해 요청
개발시간짧음비교적 길음

결합도를 이해하기

우선 결합도를 이해하기 위해선 인터페이스부터 짚고 넘어가야될거같다.

인터페이스를 이해했으니 결합도란 무엇일까?”

결합도는 서로 다른 모듈끼리의 연관성을 의미한다. 쉽게 말해서, 친구 따라 강남간다라는 속담처럼 친구가 강남을 가면 나도 같이 가게 된다. 이러한 이유는 친구와 내가 그 만큼 친밀도가 높기 때문이다. 여기서 친구와 나는 모듈이고 친밀도는 결합도를 의미한다고 볼 수 있다.

결합도에는 6가지가 있다.

자료결합도

  • 모듈끼리 데이터를 주고 받을때 순수하게 자료만 주고 받는 결합도.
  • 모듈이 바뀌더라도 다른 모듈에게 영향을 주지 않는다.

스탬프 결합도

  • 모듈끼리 배열이나 오브젝트와 같은 동일한 자료 구조를 참조하는 형태의 결합도

제어 결합도

  • 어떤 모듈이 다른 모듈의 흐름을 제어하는 경우의 결합도
  • 모듈에서 보낸 값으로 인해서 받은 모듈의 흐름이 달라짐.(if문을 사용하여 흐름제어.)

외부 결합도

  • 외부에 있는 다른 모듈의 데이터를 참조할 때의 결합도
  • 예를 들어 클래스 내부에 import와 같은 외부 모듈을 선언하여 사용하는 경우.

공통 결합도

  • 여러 개의 모듈이 어느 모듈을 공통적으로 사용할 때의 결합도
  • 공통적으로 사용하는 모듈을 변경할 경우 다른 모듈들에게 영향을 줌.

내용 결합도

  • 모듈끼리의 결합도가 가장 높음.
  • 다른 모듈의 기능을 그대로 가져와서 사용하는 경우를 말한다.

(결합도 높음) 내용 결합도 → 공통 결합도 → 외부 결합도 → 제어 결합도 → 스탬프 결합도 → 자료 결합도 (결합도 낮음)

왜 결합도를 낮춰야 되는가?

  • 기존에 있던 시스템중 어느 하나의 모듈이 변경을 했을 시, 다른 모듈에게 영향이 안가기 위해 결합도를 낮춰야된다.
  • 결합도가 높으면 다른 시스템에 영향이 미치게 되어 시스템의 로직이 꼬여버리거나 재개발할 수도 있다.

왜 Spring에서 동시성 문제를 다루는가?

  • Spring에서 사용되는 싱글톤 패턴의 특징을 보면 같은 자원을 여러 객체가 나눠서 사용하게 된다.
  • 하지만 객체가 자원을 할당 받을 때, 다른 자원도 할당 받아버리면 동시성 문제가 빈번하게 일어난다. 이러한 이유 때문에 동시성 문제를 잘 알고 솔루션을 찾아야 된다.

동시성 문제란?

  • 간단히 말해, 두 스레드 간에 같은 자원을 동시에 참조되어 나오는 이상현상이다.

동시성 문제를 해결하는 방법?

  • Synchronized를 이용 (동기화 사용)
    • 자바에서 지원하는 다른 스레드가 못들어오게 막음.
    • 서버 1대에서 운영 될 경우에는 이상 없지만, 2대 이상 운영할 경우에는 못막는다.
  • 데이터 베이스에 락을 걸어버린다.

static이란?

  • 인스턴스 생성없이 공유해서 쓰는 변수.
  • 클래스 로딩시 제일 먼저 메모리에 올라가는 변수이다.

싱글톤 패턴

  • 객체를 처음 생성하면 나눠서 객체를 사용함.
  • 객체의 자원을 아껴쓰기 위해 사용됨.
  • 스프링에서는 선언하지 않아도 자동으로 선언을 해줌.

has-a 관계 is-a관계

  • has-a관계
    • ~에 속한다 라는 의미로 포함을 의미한다. 결합도가 높을시 has-a관계.
    • 예시코드
      class Engine {
          void start() {
              System.out.println("엔진을 시작합니다.");
          }
      }
      
      class Car {
          private Engine engine;
      
          Car() {
              this.engine = new Engine();
          }
      
          void startCar() {
              engine.start();
              System.out.println("자동차를 주행합니다.");
          }
      }
      해당 코드를 보면 Engine클래스와 Car클래스로 되어 있다. Car클래스 내부에서는 Engine클래스를 선언해주고 있고. sartCar()에서 호출이 되고 있다. 이로써 Engine클래스는 Car클래스에 포함이 되는 관계(has-a)관계라고 볼 수 있다.
      classDiagram
      Car *-- Engine
      Car: Car()
      Car: startCar()
      Engine: start()
      
  • is-a관계
    • ~는 ~이다.라는 뜻으로 클래스 확장을 의미한다.
    • 예시코드
      class Animal {
          void eat() {
              System.out.println("동물이 먹이를 먹습니다.");
          }
      }
      
      class Cat extends Animal {
          void meow() {
              System.out.println("고양이가 야옹 소리를 냅니다.");
          }
      }
      고양이는 동물이다. 동물은 고양이다. 둘 중에 어느 표현이 더 적당한가 물어보면 당연히 고양이는 동물이다.라고 답할 것이다. Cat클래스는 Animal클래스로부터 상속을 받고 있는 것을 볼 수 있다. 이게 바로 is-a관계이다.
      classDiagram
      Animal <|-- Cat
      Cat: void meow()
      Animal: eat()

web.xml

참고사이트

  • 서블릿을 관리해주는 배포 지시자
  • 톰캣이 관리하는 서블릿에 대한 목록이다.
  • 서블릿을 관리하기 위한 파일이다.
  • Spring MVC에서의 web.xml의 역할
    • DispatcherServlet
      • 클라이언트로의 요청을 전달 받은 객체.
      • 클라이언트 요청을 처리해줄 컨트롤러를 찾고, 실행시켜준다.
      • 클라이언트에게 보여줄 View를 찾음.
      • 응답 데이터와 View를 클라이언트에게 전달한다.
    • ContextLoaderListener
      • Application Context 단위의 설정을 처리해준다.
      • Application Context
        • Web Application 최상단에 위치하고 있는 Context.

        • Spring에서 생성되는 Bean에 대한 IoC Container 또는 Bean Container

        • 서로 다른 여러 Servlet에서 공통적으로 공유해서 사용할 수 있는 Bean을 선언.

        • Application Context에 정의된 Bean은 Servlet Context에 정의 된 Bean을 사용할 수 없다.

          classDiagram
          BeanFactory --|> ApplicationContext 
          ApplicationContext --|> ServletContext
          
      • Servlet Context
        • Servlet단위로 실행되는 Context

        • sevlet-context.xml파일은 DispatcherServlet생성 시 필요한 설정 정보를 담은 파일.

        • Application Context를 부모 Context로 사용한다.

        • Application Context와 Servlet Context에 같은 id로 된 Bean이 등록되는 경우, Servlet Context에 선언된 Bean을 사용. (오버라이딩)

          Bean을 찾는 순서

        • Servlet Context에 먼저 찾는다.

        • 만약 Servlet Context에서 bean을 못찾는 경우 Application Context에 정의된 bean을 찾는다.

        • Servlet Context에 정의된 bean은 Application Context의 Bean을 사용할 수 있다.

    • encodingFilter
  • 쉽게 말해서 웹 어플리케이션을 실행할 때 설정(설명)들을 정의해 놓은 것이다.

ORM이란?

  • Object Relational Mapping의 약어로, 객체와 관계형 데이터 베이스를 자동으로 매핑해주는 것을 말한다.
  • 객체는 클래스의 형태이고, 데이터 베이스는 테이블의 형태로 되어 있기 때문에 두개의 모델간의 일치시키기 위한 모델을 말한다.
  • ORM 종류에는 한국에서 대표적으로 JPA와 Mybatis가 양대산맥을 이루고 있다.

Mybatis란 무엇인가?

  • 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 *퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다. 마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 어노테이션을 사용할 수 있다.

함수에서 파라미터를 받게되면 파라미터를 저장할 메모리가 생성이 된다 그래서 map형태로 파라미터 1개만 넘겨주면 거기에 알맞는 메모리가 할당이 됨.

*퍼시스턴트 프레임워크: 데이터의 CRUD를 다루는 클래스 및 설정 파일들의 집합이다.

Mybatis의 전체적인 흐름 구조

“뒤에 팩토리가 들어가면 관리해주고 조립해주는 역할.”

오브젝트 팩토리 패턴

  • 클래스를 관리하기 위한 또다른 클래스를 생성하여 관리하는 패턴을 말한다.

팩토리 패턴

  • 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브 클래스에서 결정하게 만드는 패턴이다.

오브젝트 팩토리 패턴과 팩토리 패턴의 차이?

오브젝트 팩토리 패턴은 객체 생성을 추상화하고 인터페이스를 통해 객체를 생성하는 메커니즘.

팩토리 패턴은 객체 생성을 캡슐화하고 팩토리 클래스를 통해 객체를 생성하는 방법을 제공하는데 중점.

두 패턴은 비슷한 목표를 가지고 있으며, 어떤 상황에 더 적합한지는 사용 사례에 따라 다를 수 있다.

  • 오브젝트 팩토리 패턴
    // 1. 객체 생성을 추상화하기 위한 인터페이스
    interface Shape {
        void draw();
    }
    
    // 2. 구체적인 클래스들
    class Circle implements Shape {
        public void draw() {
            System.out.println("원 그리기");
        }
    }
    
    class Rectangle implements Shape {
        public void draw() {
            System.out.println("사각형 그리기");
        }
    }
    
    // 3. 객체 생성을 추상화하는 팩토리 인터페이스
    interface ShapeFactory {
        Shape createShape();
    }
    
    // 4. 구체적인 팩토리 클래스들
    class CircleFactory implements ShapeFactory {
        public Shape createShape() {
            return new Circle();
        }
    }
    
    class RectangleFactory implements ShapeFactory {
        public Shape createShape() {
            return new Rectangle();
        }
    }
    
    public class ObjectFactoryPatternExample {
        public static void main(String[] args) {
            ShapeFactory factory1 = new CircleFactory();
            Shape circle = factory1.createShape();
            circle.draw();
    
            ShapeFactory factory2 = new RectangleFactory();
            Shape rectangle = factory2.createShape();
            rectangle.draw();
        }
    }
  • 팩토리 패턴
    // 1. 객체 생성을 캡슐화하는 팩토리 클래스
    class ShapeFactory {
        public static Shape createShape(String shapeType) {
            if (shapeType.equalsIgnoreCase("CIRCLE")) {
                return new Circle();
            } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
                return new Rectangle();
            }
            return null;
        }
    }
    
    // 2. 구체적인 클래스들
    interface Shape {
        void draw();
    }
    
    class Circle implements Shape {
        public void draw() {
            System.out.println("원 그리기");
        }
    }
    
    class Rectangle implements Shape {
        public void draw() {
            System.out.println("사각형 그리기");
        }
    }
    
    public class FactoryPatternExample {
        public static void main(String[] args) {
            Shape circle = ShapeFactory.createShape("CIRCLE");
            circle.draw();
    
            Shape rectangle = ShapeFactory.createShape("RECTANGLE");
            rectangle.draw();
        }
    }

동적 sql

  • 사용될 SQL문이 런타임시에 결정되는 SQL문.
  • String 변수에 담아서 기술하는 SQL문이다. String변수를 사용하기 때문에 조건에 따라 SQL문을 동적으로 바꿀 수 있고, 런타임 시에 사용자로부터 SQL문의 일부 또는 전부를 입력받아서 실행도 가능하다.
  • 자바에서 사용하는 String sql = “select * from where id=” + id; 같은 경우는 동적 sql이다.

동기와 비동기

  • 비동기
    • 병렬 실행이됨.
    • 동시에 처리와 결과를 수행할 수 있는 방식이다.
    • 동시성의 문제가 될 수 있음.
  • 동기
    • 순차적으로 실행이됨.
    • 동시에 처리와 결과를 수행할 수 없는 방식이다.
    • 전에 수행중이던 프로세스가 완료되어야 다음 프로세스가 실행이 됨.

Maven 과 Gradle

  • Maven과 Gradle은 빌드관리도구이다.
  • 어플리케이션을 개발하면서 라이브러리를 사용하는데, 빌드 관리도구는 라이브러리들을 자동으로 관리해주는 역할을 한다.

Maven

  • maven은 pom.xml파일로 관리한다.
  • 자바 프로젝트 빌드를 자동화 해주는 빌드 툴, 자바 소스를 compile하고 package해서 배포하는 일을 자동화
  • LifeCyle 관리 도구로 크게 Clean, Default, Site로 나눈다.
    • Clean: 이전 빌드에서 생성된 파일을 삭제
    • Default: 프로젝트 배포절차, 패키지 타입별로 다르게 정의
    • Site: 프로젝트 문서를 생성하는 단계

Gradle

  • Maven을 대체할 수 있는 범용 빌드 툴이다.
  • 스프링부트와 안드로이드에서 사용된다.
  • 빌드 속도가 Maven에 비해 10~100배정도 빠르다.
  • Maven에 비해서 가독성이 더 좋다.

자바에서 stream 두가지

  • bytestream
    • inputstream
    • outputstream
  • characterstream
    • writestream
    • readerstream

xml은 html과 다르게 확장이 가능한 마크업 언어

DTD란?

  • XML을 사용할 수 있게 적합한 문서로 사용할 수 있게 해준다.

Spring Mybatis구조

스프링의 기본 베이스는 계층 아키텍처를 기반으로 하고 있음.

context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<Resource
		name="jdbc/myora"
		auth="Container"
		type="javax.sql.DataSource"
		driverClassName="oracle.jdbc.driver.OracleDriver"
		url="jdbc:oracle:thin:@localhost:1521:xe"
		username="ict01"
		password="ict01"
		maxActive="20"
		maxIdle="10"
		maxWait="-1"/>
</Context>

톰캣에 있는 Container에서

  • 위 코드 설명 제시한 XML 코드는 일반적으로 Java 웹 어플리케이션에서 데이터베이스 연결을 설정하기 위해 사용되는 "Context" 요소와 그 하위에 위치한 "Resource" 요소로 구성된 설정 파일입니다. 이 설정은 Apache Tomcat과 같은 서블릿 컨테이너에서 사용되며, 데이터베이스에 대한 연결 정보를 정의하고 관리합니다. 이 코드의 각 부분을 설명하겠습니다:
    1. <?xml version="1.0" encoding="UTF-8"?>: XML 파일의 버전 및 인코딩을 지정하는 선언입니다.

    2. <Context>: 루트 요소로, 모든 데이터베이스 연결 정보를 포함하는 설정 컨테이너입니다.

    3. <Resource>: 데이터베이스 연결 정보를 정의하는 요소입니다. 이 요소는 다음과 같은 속성을 가지고 있습니다:
      - name: 리소스의 이름을 지정합니다. 이 이름을 사용하여 코드에서 데이터베이스 연결을 요청합니다.
      - auth: 인증 방법을 지정합니다. "Container"로 설정된 경우 컨테이너가 사용자를 인증하며, 일반적으로 데이터베이스 연결에서 사용됩니다.
      - type: 리소스의 유형을 지정합니다. 여기서는 JDBC 데이터 소스를 나타내는 "javax.sql.DataSource"를 사용합니다.
      - driverClassName: 데이터베이스 드라이버 클래스 이름을 지정합니다. 이 경우 Oracle 데이터베이스에 대한 드라이버를 사용하고 있습니다.
      - url: 데이터베이스에 연결할 URL을 지정합니다. 여기서는 Oracle 데이터베이스의 URL을 사용하고 있습니다.
      - username: 데이터베이스 연결을 위한 사용자 이름을 지정합니다.
      - password: 데이터베이스 연결을 위한 비밀번호를 지정합니다.
      - maxActive: 동시에 활성화된 최대 연결 수를 지정합니다.
      - maxIdle: 풀에 유지될 수 있는 최대 유휴 연결 수를 지정합니다.
      - maxWait: 연결 풀에서 대기할 수 있는 최대 시간을 지정합니다. "-1"은 무한 대기를 의미합니다.

      이 설정 파일을 사용하면 웹 어플리케이션에서 데이터베이스에 연결할 때 "jdbc/myora"라는 리소스 이름을 사용하여 컨테이너가 설정된 연결 정보를 활용할 수 있습니다.

JNDI → 오라클의 커넥션 풀 이름으로 커넥션 풀에서 데이터베이스에 대한 정보를 가져올수 있게끔 하는 인터페이스.

JNDI에 대한 추가 자료

DAO와 DTO

  • DTO
  • DAO

FactoryService

  • DBMS의 세션을 가능하게 해주는 서비스.
  • 기존에은 jdbc가 세션통신을 가능하게 함.
profile
설명이 가능할 때까지 공부하기.

0개의 댓글