1. DOM(Document Object Model, 돔)

  • 웹 문서의 모든 요소를 자바스크립트를 이용하여 조작할 수 있도록 객체를 사용해 문서를 해석하는 방법
  • 웹 문서의 텍스트, 이미지, 표 등 → 객체
  • document를 사용하면 자바스크립트에서 웹 문서 소스를 전부 인식할 수 있음(document는 수많은 DOM 요소 중 하나)

2. DOM 트리

  • 문서 노드(Document Node): 트리의 최상위, DOM tree에 접근하기 위한 시작점
  • 요소 노드(Element Node): HTML 요소를 표현, HTML 노드는 중첩에 의해 부자 관계를 가짐
  • 어트리뷰트 노드(Attribute Node): HTML 요소의 어트리뷰트를 표현, 해당 어트리뷰트가 지정된 요소의 자식이 아니라 해당 요소의 일부로 표현
  • 텍스트 노드(Text Node): HTML 요소의 텍스트를 표현, 요소 노드의 자식이며 자신의 자식 노드를 가질 수 없음, DOM tree의 최종단

software.hixie.ch/utilities/js/live-dom-viewer

3. DOM 요소에 접근하기

  • 자바스크립트로 DOM 요소에 접근할 때 → ‘선택자’ 사용

1) getElementById()

  • id 선택자로 접근하는 함수

id 속성 값은 한 문서 안에서 유일
제목 요소에 접근

2) getElementsByClassName()

  • class값으로 찾아내는 함수
  • id 선택자와 다르게 웹 문서 안에서 여러 번 사용할 수 있음
  • 2개 이상의 웹 요소에 접근

배열의 인덱스를 사용하면 원하는 요소를 가져올 수 있음

3) getElementsByTagName()

  • id나 class 선택자가 없는 DOM 요소에 접근

4) querySelector(), querySelectorAll()

  • DOM 요소를 다양한 방법으로 찾아주는 함수
  • id, class 값을 사용해도 되고 태그 이름을 사용해도 됨
  • class 값 앞에는 마침표(.), id 값 앞에는 샵(#)을 붙임, 태그 이름은 기호 없이 태그 이름만 사용

*참고

  1. Do it! 자바스크립트 입문
  2. https://poiemaweb.com/js-dom

'오공완' 카테고리의 다른 글

정처기 3과목: 데이터베이스  (0) 2024.02.22
정처기 3과목: 자료 구조  (0) 2024.02.21
스프링 부트3 시작하기  (0) 2024.02.05
231121 오공완  (0) 2023.11.21
231120 오공완  (0) 2023.11.21

#참고도서: '스프링 프레임워크 첫걸음' (키노시타 마사아키, 위키북스)

 

07장: 요청 파라미터 취득하기

1. 요청 파라미터(request parameter)

- 서버에 전송되는 값

- 취득 방법: @RequestParam 사용, Form 클래스 사용

- 하나의 뷰에 버튼이 여러 개 있을 때 어느 버튼이 클릭되어 요청이 보내졌는지를 식별해야 하는 경우 사용되는 것이 '요청 매핑(RequestMapping)' 어노테이션의 'params 속성'

 

2. 입력값을 받는 프로그램 만들기(@RequestParam)

1) 컨트롤러와 뷰 생성

- controller 패키지 생성, RequestParamController 클래스 생성

- 뷰 생성(입력화면)

- 컨트롤러에 요청 핸들러 메서드 추가

- 뷰 생성(확인 화면)

- http://localhost:8080/show

- @RequestParam 어노테이션은 편리하지만, 요청 파라미터를 하나씩 인수로 받기 때문에 입력 항목이 늘어날수록 인수도 함께 늘려야 하므로 확장성에 문제 발생

 

3. 입력값을 받는 프로그램 만들기(Form 클래스)

1) Form 클래스 생성

2) 뷰 생성(확인 화면: Form 클래스 사용)

 

4. URL에 포함된 값을 받는 프로그램 만들기

1) 컨트롤러 생성

2) 뷰 생성(입력 화면)

- 컨트롤러에 추가(링크 처리)

3) 뷰 생성(기능 화면)

- 컨트롤러에 추가(버튼 판별 처리)

4. 뷰 생성(버튼 클릭 확인 화면)

#참고도서: '스프링 프레임워크 첫걸음' (키노시타 마사아키, 위키북스)

 

05장: MVC 모델 알아보기

1. MVC 모델

- 프로그램의 처리 역할을 나누어서 프로그램을 작성하는 방법

- 모델(Model): 비즈니스 로직 담당, 시스템의 코어 부분, 시스템의 목적을 처리하는 부분

- 뷰(View): 사용자 입력과 결과 출력 등 시스템에서 표현 부분을 담당

- 컨트롤러(Controller): 서비스 처리를 담당하는 모델과 화면 표시를 담당하는 뷰를 제어하는 역할, 사용자가 입력한 내용을 뷰에서 받고, 받은 데이터를 기준으로 모델에 내용을 전달

- 장점: 역할 분담을 통해 효율적인 개발 가능, 개발하는 엔지니어의 분업화가 용이, 설계 변경에 유연하게 대응 가능

 

2. 스프링 MVC

- 웹 애플리케이션을 간단하게 만들 수 있는 기능을 제공하는 프레임워크

1) 주요 구성 요소

- DispatcherServlet: 모든 요청을 수신하는 프런트 컨트롤러

- Model: 컨트롤러에서 뷰에 넘겨주는 표시용 데이터 등을 저장하는 객체

- 컨트롤러: 요청에 대응해서 처리할 내용이 있는 곳

- 서비스 처리: 데이터베이스에 접속해서 데이터를 취득하거나 데이터를 가공하는 등 여러 가지 작업을 실행. 개발자가 설계하고 구현(스프링 MVC와 관계없음)

- 뷰: 화면 표시 처리

 

@Controller: 클라이언트와 데이터 입출력을 제어하는 애플리케이션 레이어의 컨트롤러를 부여

@RequestMapping: 컨트롤러의 요청 핸들러 메서드와 URL을 매핑

@GetMapping: @RequestMapping의 GET 요청용 어노테이션

@PostMapping: @RequestMapping의 POST 요청용 어노테이션

 

3. 뷰 생성 규칙

- resources/templates 폴더 밑에 뷰를 생성

- 뷰가 많이 필요한 경우에는 기능별로 폴더를 만들어서 보관

- 폴더를 나눈 경우는 templates 폴더 이하의 폴더명을 요청 핸들러 메서드의 반환값에 지정

- CSS나 자바스크립트 등은 resources/static 폴더에 배치

 

#참고도서: '스프링 프레임워크 첫걸음' (키노시타 마사아키, 위키북스)

04장: 데이터베이스 작업

  1. 데이터베이스/테이블
  1. 관계형 데이터베이스(Relational Database)
  • 데이터를 표 형식으로 표현하고, 여러 표에서 항목의 값 사이에 관계를 맺고 있는 데이터베이스
  1. 레코드와 칼럼
  • 테이블의 가로 행(row)을 레코드(record)
  • 하나의 레코드가 한 건의 데이터
  • 테이블의 세로 열(column)을 칼럼(column)
  1. 데이터 입력
  1. SQL(Structured Query Language, 구조화 질의어)
  • 데이터베이스를 조작하기 위한 언어
  • CRUD: 영속적으로 데이터를 취급하는 4개의 기본적인 기능(생성, 읽기, 갱신, 삭제)
  • SQL의 CRUD

CRUD 명령어 개요

생성(Create) INSERT 데이터를 등록
읽기(Read) SELECT 데이터를 참조
갱신(Update) UPDATE 데이터를 갱신
삭제(Delete) DELETE 데이터를 삭제
  1. 엔티티와 리포지토리 알아보기
  1. 엔티티
  • 데이터를 담아두는 객체
  • 데이터베이스 테이블의 한 행(레코드)에 대응하는 객체
  1. 리포지토리
  • 데이터베이스를 조작하는 클래스
  • 리포지토리를 생성하는 경우에는 반드시 인터페이스를 정의하고 구현해야 함
  1. 스프링 데이터 JDBC 사용해보기
  1. JDBC
  • O/R 매퍼
  • 스트링 데이터가 제공하는 CrudRepository를 상속해서 자동으로 CRUD를 지원하는 메서드를 사용할 수 있음

<롬복에서 제공하는 어노테이션>

@Data: 클래스에 부여하는 것으로, 전 필드에 대해 getter/setter로 액세스할 수 있음. hashCode(), equals(), toString()도 자동 생성

@NoArgsConstructor: 클래스에 부여하는 것으로, 기본 생성자가 자동 생성됨

@AllArgsConstructor: 클래스에 부여하는 것으로, 전 필드에 대해 초기화 값을 인수로 가지는 생성자가 자동 생성됨

자바 백엔드 환경의 핵심은 스프링 부트!

JPA: 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스

포스트맨: HTTP 요청을 보낼 수 있는 클라이언트 프로그램

 

[서버와 클라이언트]

  1. 클라이언트
  • 서버로 요청하는 프로그램
  • ex) 웹 브라우저에서 주소를 입력한 뒤 enter을 눌러 정보를 요청하는 행위 → ‘서버에 요청한다’
  1. 서버
  • 클라이언트의 요청을 받아 처리하는 주체

[데이터베이스]

  1. 데이터베이스
  • 데이터베이스 관리 시스템: MySQL, 오라클, 포스트그레SQL 등
  • 클라이언트에서 SQL(데이터베이스 조작 언어)로 데이터베이스 관리 시스템에 데이처 요청하면 데이터베이스 관리 시스템은 데이터베이스에서 데이터를 꺼내 응답
  1. RDB: Relational Database
  • 관계형 데이터베이스
  • 데이터를 행과 열로 이루어진 테이블로 관리하며 기본키를 사용해 각 행을 식별
  • 각 테이블 간에 관계를 지을 수 있음
  • 오라클, 마이에스큐엘, SQL 서버, 포스트그레큐엘 등
  1. SQL: Structured Query Language
  • 쿼리, 즉 데이터 검색을 하는 언어
  1. NoSQL
  • SQL을 쓰지 않음 or Not Only SQL
  • RDB의 성능을 올리기 쉽지 않은 문제들을 해결하기 위해 등장
  • 다이나모디비, 카우치베이스, 몽고디비 등

[아이피와 포트]

  • 아이피: 서버를 찾기 위한 번호
  • 포트: 그 서버에서 운용되고 있는 서비스를 구분하기 위한 번호

[라이브러리와 프레임워크]

  1. 라이브러리
  • 애플리케이션 개발에 필요한 기능인 클래스, 함수 등을 모아놓은 코드의 모음
  • 개발을 하는 과정에서 필요한 기능을 구현하기 위해 사용
  • 라이브러리는 독립적으로 라이브러리끼리 영향을 크게 주지 않음
  1. 프레임워크
  • 소프트웨어 개발을 수월하게 하기 위한 소프트웨어 개발 환경
  • 일(work)하기 위한 틀(frame)을 제공
  • 애플리케이션을 개발할 때 전체적인 구조를 잡기 위해 사용하는 것

[스프링 부트]

  1. 스프링과 스프링 부트
  • 스프링의 단점을 보완하여 출시됨
  • 스프링 프레임워크를 더 쉽고 빠르게 이용할 수 있도록 만들어주는 도구
  • 스프링 부트는 스프링에 속한 도구
  1. 스프링 부트의 주요 특징
  • 톰캣, 제티, 언더토우 같은 웹 애플리케이션 서버(WAS)가 내장되어 있어서 따로 설치를 하지 않아도 독립적으로 실행할 수 있음
  • 빌드 구성을 단순화하는 스프링 부트 스타터를 제공
  • XML 설정을 하지 않고 자바 코드로 모두 작성할 수 있음
  • JAR를 이용해서 자바 옵션만으로도 배포가 가능
  • 애플리케이션의 모니터링 및 관리 도구인 스프링 액츄에이터(spring actuator)를 제공
  1. 스프링과 스프링 부트의 차이
  • 구성의 차이: 스프링은 개발에 필요한 환경을 수동 구성, 스프링 부트는 자동으로 로드
  • 내장WAS의 유무: 스프링 부트는 jar 파일만 만들면 별도로 WAS를 설정하지 않아도 애플리케이션 실행 가능

[스프링의 주요 콘셉트]

  1. 제어의 역전성과 의존성 주입

1-1. IoC (Inversion of Control): 제어의 역전

  • 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것
  • 스프링 컨테이너가 객체를 관리, 제공하는 역할을 함

1-2. DI (Dependency Injection): 의존성 주입

  • 어떤 클래스가 다른 클래스에 의존한다는 뜻
  • 클래스 A에서 B 객체를 쓰고 싶은 경우 객체를 직접 생성하는 것이 아니라 스프링 컨테이너에서 객체를 주입받아 사용

[빈과 스프링 컨테이너]

  1. 스프링 컨테이너
  • 빈을 생성하고 관리
  • @Autowired: 스프링 컨테이너에 있는 빈을 주입
  • 스프링 컨테이너가 생성하고 관리하는 객체

[관점 지향 프로그래밍]

  • AOP, Aspect Oriented Programming
  • 프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화하는 것

[이식 가능한 서비스 추상화]

  • PSA, Portable Service Abstraction
  • 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스

!! 스프링 프레임워크는 IoC/DC를 통해 객체간의 의존 관계를 설정, AOP를 통해 핵심 관점과 부가 로직을 분리해 개발, PSA를 통해 추상화된 다양한 서비스들을 일관된 방식으로 사용하도록 함

  • IoC: 객체의 생성과 관리를 개발자가 하는 것이 아니라 프레임워크가 대신하는 것
  • DI: 외부에서 객체를 주입받아 사용하는 것
  • AOP: 프로그래밍을 할 떄 핵심 관점과 부가 관점을 나누어서 개발하는 것
  • PSA: 어느 기술을 사용하던 일관된 방식으로 처리하도록 하는 것

[스프링 부트 3 프로젝트 만들기]

Gradle 프로젝트를 스프링 부트 3 프로젝트로 바꾸는 방법: build.gradle 수정

http://localhost:8080/test

  • localhost는 아이피로는 127.0.0.1: 컴퓨터에서 사용하는 루프백 호스트명, 현재 사용중인 컴퓨터 의미
  • 8080: 스프링 부트의 포트 번호
  • test: 코드에 @GetMapping이라는 애너테이션으로 메서드와 매핑할 때 스프링 부트에서 설정한 경로

[스프링 부트 스타터]

  • 의존성이 모여 있는 그룹
  • 명명규칙: spring-boot-starter-{작업유형}
  •  

[자동 구성]

  • 스프링 부트에서는 애플리케이션이 최소한의 설정만으로도 실행되게 여러 부분을 자동으로 구성

[스프링 부트 3 코드 이해하기]

  1. @SpringBootApplication
@SpringBootApplication
public class SpringBootDeveloperApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDeveloperApplication.class, args);
    }
}
  • 스프링 부트 사용에 필요한 기본 설정
  • @SpringBootConfiguration: 스프링 부트 관련 설정을 나타냄
  • @ComponentScan: 사용자가 등록한 빈을 읽고 등록, @Component라는 애너테이션을 가진 클래스들을 찾아 빈으로 등록
  • @EnableAutoConfiguration: 스프링 부트에서 자동 구성을 활성화, 서버가 실행될 때 스프링 부트의 메타 파일을 읽고 정의된 설정들을 자동으로 구성
  1. 테스트 컨트롤러 살펴보기
@RestController
public class TestController {
    @GetMapping("/test")
    public String test() {
        return "Hello, world!";
    }
}
  • @RestController: 라우터 역할, HTTP 요청과 메서드를 연결, 클라이언트의 요청에 맞는 메서드를 실행
  • TestController를 라우터로 지정해 /test라는 GET 요청이 왔을 때 test() 메서드를 실행하도록 구성
  • @Compponent 애너테이션이 있는 클래스는 빈으로 등록되며, @Controller, @RestController, @Configuration, @Repository, @Service 모두 @Component 애터네이션을 가지고 있음

[스프링 부트 3 구조 살펴보기]

  1. 계층
  • 프리젠테이션 계층: HTTP 요청을 받고 이 요청을 비즈니스 계층으로 전송하는 역할, 컨트롤러
  • 비즈니스 계층: 모든 비즈니스 로직을 처리, 서비스
  • 퍼시스턴스 계층: 모든 데이터베이스 관련 로직을 처리,리포지토리

[테스트 코드]

  1. given-when-then 패턴
  • given: 테스트 실행 준비단계
  • when: 테스트 진행 단계
  • then: 테스트 결과 검증 단계
  1. JUnit
  • 자바 언어를 위한 단위 테스트 프레임워크
  • 테스트 방식을 구분할 수 있는 애너테이션을 제공
  • @Test 애너테이션으로 메서드를 호출할 때마다 새 인스턴스를 생성, 독립 테스트 가능
  • 예상 결과를 검증하는 어설션 메서드 제공
  • 사용 방법이 단순, 테스트 코드 작성 시간이 적음
  • 자동 실행, 자체 결과를 확인하고 즉각적인 피드백을 제공
import org.aspectj.lang.annotation.After;
import org.junit.jupiter.api.*;

public class JUnitCycleTest {
    @BeforeAll      // 전체 테스트를 시작하기 전에 1회 실행하므로 메서드는 static으로 선언
    static void beforeAll() {
        System.out.println("@BeforeAll");
    }

    @BeforeEach     // 테스트 케이스를 시작하기 전마다 실행
    public void beforeEach() {
        System.out.println("@BeforeEach");
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }

    @Test
    public void test2() {
        System.out.println("test2");
    }

    @Test
    public void test3() {
        System.out.println("test3");
    }

    @AfterAll       // 전체 테스트를 마치고 종료하기 전에 1회 실행하므로 메서드는 static으로 선언
    static void afterAll() {
        System.out.println("@AfterAll");
    }

    @AfterEach      // 테스트 케이스를 종료하기 전마다 실행
    public void afterEach() {
        System.out.println("@AfterEach");
    }
}

[데이터베이스]

  1. 데이터베이스 관리자
  • DBMS, database management system
  • 관계형 DBMS = RDBMS(relational): 테이블 형태로 이루어진 데이터 저장소
  1. 데이터베이스 용어
  • 테이블: 데이터를 구성하기 위한 가장 기본적인 단위
  • 행 row: 가로로 배열된 데이터의 집합, 고유한 식별자인 기본키를 가짐, 레코드 record라고 부르기도 함
  • 열 column: 행에 저장되는 유형에 데이터
  • 기본키 primary key: 행을 구분할 수 있는 식별자, 테이블에서 유일해야 하며 중복값을 가질 수 없음, 수정되어서는 안 되며 유효한 값이어야 함(NULL이 될 수 없음)
  • 쿼리 query: 데이터를 조회하거나 삭제, 생성, 수정 같은 처리를 하기 위해 사용하는 멸여문

[ORM, object-relational mapping]

  1. ORM
  • 자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법
  • 장점: SQL을 직접 작성하지 않아도 됨
  • 단점: 프로젝트 복잡성이 커질수록 사용 난이도 올라감, 복잡하고 무거운 쿼리는 해결 불가능한 경우도 있음
  1. JPA (java persistence API)
  • 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
  • 인터페이스이므로 실제 사용을 위해서는 ORM 프레임워크를 추가로 선택해야함
  • 하이버네이트: JPA 인터페이스를 구현한 구현체, 자바용 ORM 프레임워크, 내부적으로는 JDBC API 사용

[엔티티]

  1. 엔티티
  • 데이터베이스의 테이블과 매핑되는 객체
  • 본질적으로는 자바 객체이나 테이블과 직접 연결된단든 특징이 있어 구분지어 부름
  • 데이터베이스에 영향을 미치는 쿼리를 실행하는 객체
  1. 엔티티 매니저
  • 엔티티를 관리해 데이터베이스와 애플리케이션 사이에서 객체를 생성, 수정, 삭제하는 등의 역할
  • 엔티티 팩토리: 엔티티 매니저를 만드는 곳, @PersistenceContext 또는 @Autowired 사용
  1. 영속성 컨텍스트
  • JPA의 중요한 특징 중 하나로, 엔티티를 관리하는 가상의 공간
  • 1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩
  1. 엔티티의 상태
  • 분리 detached: 영속성 컨텍스트가 관리하고 있지 않는 상태
  • 관리 managed: 영속성 컨텍스트가 관리하는 상태
  • 비영속 transient: 영속성 컨텍스트와 전혀 관계가 없는 상태
  • 삭제 removed: 삭제된 상태

[스프링 데이터와 스프링 데이터 JPA]

  1. 스프링 데이터 JPA
  • 리포지터리 역할을 하는 인터페이스를 만들어 데이터베이스의 테이블 조회, 수정, 생성, 삭제 같은 작업을 간단히 할 수 있음
public interface MemberRepository extends JpaRepository<Member, Long>{
}         // 기존 CRUD 메서드를 사용하기 위한 JpaRepository 상속 예
  • 리포지토리: 엔티티에 있는 데이터들을 조회하거나 저장, 변경, 삭제를 할 때 사용하는 인터페이스
  • JpaRepository 클래스를 상속받을 때, 엔티티 Member와 엔티티 기본키 타입 Long을 인수로 넣어

'오공완' 카테고리의 다른 글

정처기 3과목: 자료 구조  (0) 2024.02.21
자바스크립트: 문서 객체 모델(DOM)  (0) 2024.02.20
231121 오공완  (0) 2023.11.21
231120 오공완  (0) 2023.11.21
231115 오공완  (0) 2023.11.16

#참고도서: '스프링 프레임워크 첫걸음' (키노시타 마사아키, 위키북스)

 

03장: 스프링 프레임워크의 핵심 기능 알아보기

 

1.  의존성 주입(DI)

- 의존하는 부분을 외부에서 주입하는 것

1) 클래스 의존(구현 의존)

- '사용하는 객체' 클래스에서 '사용되는 객체' 클래스의 타입을 직접 지정해 버리면 '사용되는 객체' 클래스를 변경할 경우 이를 이용하고 있는 곳을 모두 수정해야 함

- 수정할 부분이 늘어나면 실수가 발행할 위험과 시간이 늘어남

2) 인터페이스 의존

- 참조를 받는 유형으로 사용할 수 있으므로 변수의 이름을 변경하지 않아도 됨

- 인터페이스가 선언된 메서드를 이용하면 클래스가 바뀌어도 메서드명을 변경하지 않아도 됨

- 클래스 의존보다 인터페이스 의존을사용하는 것으로 수정할 곳을 줄일 수 있음

 

2. 관점 지향 프로그래밍(AOP)

1) 중심적 관심사(Primary Concern)

- 실현해야 할 기능을 나타내는 프로그램

2) 횡단적 관심사(Crosscutting-Concerns)

- 본질적인 기능은 아니지만 품질이나 유지보수 등의 관점에서 반드시 필요한 기능을 나타내는 프로그램

- 예외처리, 로그 정보 화면이나 파일 등으로 출력 처리, 데이터베이스의 트랜잭션 제어 등

 

3. DI 컨테이너 다섯 가지 규칙

1) 인터페이스를 이용하여 의존성을 만든다

- 의존하는 부분에 인터페이슬르 이용한다는 것

2) 인스턴스를 명시적으로 생성하지 않는다

- 인스턴스 생성에 new 키워드를 사용하지 않는다는 것

3) 어노테이션을 클래스에 부여한다 & 4) 스프링 프레임워크에서 인스턴스를 생성한다

- 인스턴스를 생성하려는 클래스에 인스턴스 생성 어노테이션을 부여한다는 것

- @Controller: 인스턴스 생성 지시, 스프링 MVC를 이용할 때 컨트롤러에 부여

- @Service: 인스턴스 생성 지시, 트랜잭션 경계가 되는 도메인(서비스) 기능에 부여

- @Repository: 인스턴스 생성 지시, 데이터베이스 액세스(리포지토리) 기능에 부여

- @Component: 위 용도 이외의 클래스에 부여

5) 인스턴스를 이용하고 싶은 곳에 어노테이션을 부여한다

- 스프링 프레임워크에 의해 생성된 인스턴스를 이용하는 클래스에 참조를 받는 필드를 선언하고 필드에 @Autowired 어노테이션 부여

 

4. DI 프로그램 만들기

// 인사 인터페이스
public interface Greet {

    // 인사하기
    void greeting();
    
}
// Greet 구현 클래스, 아침 인사 하기
@Component
public class MorningGreet implements Greet{
    @Override
    public void greeting(){
        System.out.println("-------------");
        System.out.println("좋은 아침입니다");
        System.out.println("-------------");
    }
}
//스프링부트 시작 클래스
@SpringBootApplication
public class BookstudyApplication {

    //메인 메서드: 자신의 execute 메서드를 호출하도록 작성
    public static void main(String[] args) {
        SpringApplication.run(BookstudyApplication.class, args)
                .getBean(BookstudyApplication.class).execute();
    }

    //주입하는 곳(인터페이스)
    @Autowired
    Greet greet;

    //실행 메서드
    private void execute(){
        greet.greeting();
    }
}

 

[소스코드 설명]

- 스프링 프레임워크는 기동 시 컴포넌트 스캔에 의해 MorningGreet 클래스에 @Component 어노테이션이 부여되어 MorningGreet 인스턴스가 생성됨

- @Autowired 어노테이션에 따라 MorningGreet 클래스의 인스턴스가 클래스의 greet 필드에 주입되어 실행되면 MorningGreet 클래스의 getting 메서드가 실행됨

 

[요약]

- 스프링 프레임워크는 임의로 구현한 클래스를 인스턴스화하는 기능을 제공(DI 컨테이너)

- 스프링 프레임워크를 사용하는 애플리케이션은 인스턴스를 명시적으로 생성하지 않음(new 키워드를 사용하지 않음)

- 정해진 어노테이션(@Component)을 클래스에 부여하는 것으로 스프링 프레임워크가 인스턴스를 생성

- 생성된 인스턴스를 사용하고 싶은 부분에서 필드를 준비하고 주석(@Autowired)을 부여하면 스프링 프레임워크가 인스턴스가 필요한 것으로 판단하고 인스턴스를 주입

- 인스턴스를 이용해서 의존성을 만들고 DI를 사용하여 '사용되는 객체' 클래스를 변경하는 경우 '사용하는 객체' 클래스의 수정 없이 변경할 수 있음

 

5. 어노테이션

1) 도메인 주도 설계 레이어

- Application Layer: 클라이언트와 데이터의 입출력을 제어하는 레이어

- Domain Layer: 애플리케이션의 중심이 되는 레이어로서 업무 처리를 수행하는 레이어

- Infrastructure Layer: 데이터베이스에 대한 데이터 영속성 등을 담당하는 레이어

2) 레이어별 인스턴스 생성 어노테이션

- @Controller: 애플리케이션 레이어의 컨트롤러에 부여

- @Service: 도메인 레이어의 업무 처리에 부여

- @Repository: 인프라 레이어의 데이터베이스 액세스 처리에 부여

- @Component: 하위 로직을 처리할 때 사용

 

6. 관점 지향 프로그래밍(AOP, Aspect Oriented Programming)

- 프로그램을 '중심적 관심사'와 '횡단적 관심사' 2개의 요소로 구성되어 있다고 생각

- AOP는 본질적인 기능은 아니나 꼭 필요한 기능인 횡단적 관심사를 분리함으로써 기존 코드를 수정하지 않아도 프로그램 중에 특정 기능(공통 처리)을 추가할 수 있음

1) AOP 고유 용어

- Advice, Aspect, JoinPoint, Pointcut, Interceptor, Target

2) 어드바이스의 다섯 가지 어노테이션 종류

- @Before, @AfterReturning, @AfterThrowing, @After, @Around

3) 포인트컷 식

- 직접 어드바이스를 만드는 경우 패키지, 클래스, 메서드 등 어드바이스 삽입 대상을 조건으로 지정할 수 있음

- 지정하는 조건 방법에는 포인트 컷 사용

- execute(반환값 패키지.클래스.메서드(인수))

package me.yuan.bookstudy.used.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;

@Aspect //어드바이스를 기술하는 클래스
@Component  //인스턴스 생성
public class SampleAspect {

    @Before("execution(* me.yuan.bookstudy.used.*Greet.*(..))")     //메서드 실행 전에 호출
    public void beforeAdvice(JoinPoint joinPoint) {
        //시작 부분 표시
        System.out.println("=== Before Advice ===");
        //날짜를 출력
        System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(new java.util.Date()));
        //메서드 이름 출력
        System.out.println(String.format("메서드:%s", joinPoint.getSignature().getName()));
    }

    @After("execution(* me.yuan.bookstudy.used.*Greet.*(..))")      //메서드 실행 후에 호출
    public void afterAdvice(JoinPoint joinPoint) {
        //시작 부분 표시
        System.out.println("=== After Advice ===");
        //날짜를 출력
        System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(new java.util.Date()));
        //메서드 이름 출력
        System.out.println(String.format("메서드:%s", joinPoint.getSignature().getName()));
    }

    @Around("execution(* me.yuan.bookstudy.used.*Greet.*(..))")     //메서드 실행 전후에 호출
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        //시작 부분 표시
        System.out.println("=== Arou줌d Advice ===");
        System.out.println("*** 처리전 ***");
        //지정한 클래스의 메서드 실행
        Object result = joinPoint.proceed();
        System.out.println("*** 처리후 ***");
        //반환값을 돌려줄 필요가 있는 경우에는 Object 타입의 반환값을 돌려줌
        return result;
    }
}

 

4) Around Advice와 다른 어드바이스와의 차이

- 인수는 ProceedingJoinPoint 인터페이스 타입을 지정

- 어드바이스 중에서 ProceedingJoinPoint 인터페이스의 proceed() 메서드를 호출

- 어드바이스 적용 대상의 메서드를 임의의 타이밍으로 호출할 수 있으므로 전후로 다양한 처리가 가능

 

7. @Transactional

- 트랜잭션 관리에 사용하는 어노테이션

- 데이터베이스 액세스 처리 메서드가 정상 종료하면 트랜잭션을 커밋하고 예외가 발생하면 롤백

 

 

 

#참고도서: '스프링 프레임워크 첫걸음' (키노시타 마사아키, 위키북스)

 

02장: 기초 지식 배우기

 

1. 인터페이스

- 자바에서 클래스에 포함하는 메서드의 구체적인 내용을 작성하지 않고 상수와 메서드 타입만 정의한 것

1) 인터페이스 선언

- interface 키워드 사용

- public abstract 암묵적 접근 제어자

public interface Greet {
    /**
     * 인사하기
     */
    public abstract void greeting();
}

2) 인터페이스 구현

- implements 키워드 사용

- 인터페이스로 정의되는 추상 메서드를 모두 구현할 필요가 있어 구현하지 않는 경우에는 컴파일 에러 발생

- 구현 시 public 선언 필요

- @Override:슈퍼 클래스나 인터페이스의 메서드를 상속 혹은 구현하는 클래스에서 재정의하는 것

public class MorningGreet implements Greet{
    @Override
    public void greeting(){
        System.out.println("좋은 아침입니다");
    }
}

 

2. 리스트

1) 컬렉션(Collection): 복수의 데이터를 더 쉽게 사용할 수 있는 클래스

- 리스트(List): 순서대로 데이터를 저장, 데이터의 중복을 허용

- 세트(Set): 순서를 유지하지 않는 집합, 중복을 허용하지 않음

- 맵(Map): 키와 값의 쌍으로 이루어진 데이터 집합, 순서는 유지되지 않고 키의 중복을 허용하지 않으며 값의 중복을 허용

2) 리스트 개요

- 컬렉션 프레임워크에서 제공하는 인터페이스

- ArrayList: 요소를 배열로 유지하기 때문에 요소의 검색을 고속으로 처리할 수 있지만, 요소의 수가 많아지면 추가/삭제를 처리하는 데 시간이 걸림

- LinkedList: 요소끼리 전후 양방향의 링크를 참조하는 리스트 구조를 이용해 관리하기 때문에 요소의 추가나 삭제 ArrayList보다 빠름, 그러나 특정 요소 검색과 같은 인덱스 값에 의한 무작위 액세스에는 적합하지 않음

 

3. 클라이언트와 서버

- 클라이언트: 서비스를 요청하는 쪽

- 서버: 서비스를 제공하는 쪽

 

4. 브라우저

- 인터넷을 사용할 때 이용하는 소프트웨어

- 크롬, 파이어폭스, 사파리 등

 

5. 애플리케이션

- 응용 프로그램 소프트웨어의 약어

- 프로그래밍 언어로 작성한 소프트웨어

 

6. 웹 서버

- 웹 애플리케이션을 배포하는 서버

- 웹 서버는 항상 실행되며 클라이언트로부터 액세스(요청)을 계속 기다림

 

7. HTTP 통신(프로토콜)

- 클라이언트와 웹 서버는 HTTP 요청(request)와 HTTP 응답(response)으로 상호작용

- HTTP 통신의 흐름: 클라이언트가 브라우저에 URL 입력 → 클라이언트에서 웹 서버로 HTTP 요청이 전송됨 → 웹 서버는 HTTP 요청에 해당하는 HTTP 응답을 클라이언트에게 반환 → 브라우저는 받은 응답을 표시하고 클라이언트가 이를 확인

 

8. GET 메서드와 POST 메서드

- HTTP 요청의 한 유형

1) GET 메서드

- 브라우저에서 웹 서버로 값을 전달할 때 URL 뒤에 값을 더하여 보내는 방식

- URL 뒤에 오는 정보를 '쿼리 스트링' 또는 '쿼리 문자열'이라고 함

2) 쿼리 스트링의 특징

- URL 끝에 '?'가 붙어 쿼리 스트링의 시작을 나타냄 (예: domain.com/?)

- 형식은 '이름=값' (예: domain.com/?name=value)

- 여러 값을 전달하려면 '&'로 연결 (예: domain.com/?name=value&tel=010)

3) POST 메서드

- 브라우저로부터 웹 서버에 값을 보낼 때 '요청 본문(request body)'이라고 하는 URL에는 보이지 않는 장소에 값을 넣어서 보내는 방법

- 개인정보 등의 내용을 URL에 표시하고 싶지 않을 때 사용

- 많은 양의 값을 보내는 데 적합

 

#참고도서: '스프링 프레임워크 첫걸음' (키노시타 마사아키, 위키북스)

 

01장: 스프링 프레임워크 알아보기

 

1. 프레임워크(framework)

- 소프트웨어나 애플리케이션 개발을 간단하게 해주는 뼈대

- 장점: 개발에 필요한 기본 기능을 제공하여 자신이 모든 기능을 작성할 필요가 없어 시간 및 비용 절약 가능

- 단점: 프레임워크 고유 사용법 이해 필요

 

2. 스프링 프레임워크

- 자바 개발 환경에서 사용되는 프레임워크

1) 스프링 부트(Spring Boot)

- 스프링 애플리케이션을 복잡한 설정 없이 빠르게 작성하는 기능 제공

2) 스프링 프로젝트

- 스프링 MVC: 웹 애플리케이션을 간단하게 생성하는 기능 제공

- 스프링 데이터: 데이터 접근에 관한 기능 제공

- 스프링 배치: 배치 처리 기능 제공

- 스프링 시큐리티: 인증/허가 기능 제공

3) 스프링 코어

- 스프링 DI: 의존성 주입(Dependency Injection) 기능 제공

- 스프링 AOP: 관점 지향 프로그래밍(Aspect Oriented Programming) 기능 제공

 

 

+ Recent posts