인프런 강의 주소


보는 방법

  • 블로그에 메모한 내용만으로 복습하기에는 무리.
  • 강의 자료는 해당 강의에서 제공해 줌. 강의 자료로 복습하고, 기억나지 않는다 싶으면 영상 보기.
  • 여기서는 다음을 기록.
    • 강의 핵심 키워드
    • 강의를 보고 생긴 의문에 대해 구글링해서 찾은 내용
    • 나중에 다시 볼 때 참고할 만한 정보


1. 프로젝트 환경설정

프로젝트 생성

의문점

  • gradle과 maven은 무슨 도구지?
    • 인용 사이트
    • 빌드 관리 도구
      • 우리가 프로젝트에서 작성한 java 코드와 프로젝트 내에 필요한 각종 xml, properties, jar 파일들을 JVM이나 WAS가 인식할 수 있도록 패키징 해주는 빌드 과정 == “빌드 자동화 도구” 라고 할 수 있다.
      • 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램
      • 애플리케이션을 개발하면서, 일반겅로로 개발에 필요한 다양한 외부 라이브러리들을 다운로드하고, 해당 라이브러리를 사용하여 개발해야하는 상황이 많다. 이 때 각 라이브러리들을 번거롭게 모두 다운받을 필요없이, 빌드도구 설정파일에 필요한 라이브러리 종류와 버전들, 종속성 정보를 명시하여 필요한 라이브러리들을 설정파일을 통해 자동으로 다운로드 해주고 이를 간편히 관리해주는 도구이다.

참고할 정보

  • VSCode에서 Run Code하면 안되고, 디버그로 실행해야 함.
  • “Spring Initializr Java Support”라는 vsCode extension과 “https://start.spring.io” 기능은 같다.


라이브러리 살펴보기

키워드

  • 라이브러리 의존관계
  • 빌드 관리 도구
  • log(logback, slf4j), test(junit)


view 환경설정

키워드

  • Welcome Page(index.html)
  • thymeleaf 템플릿 엔진
  • viewResolver


빌드하고 실행하기

키워드

  • 빌드, 배포

의문점

  • 빌드와 배포 의미
    • 인용 사이트
    • 로컬 PC에서 개발하고, 서버에 반영하는 것을 배포(deploy)이다. 배포하기 위한 과정을 빌드라고 한다.
    • 빌드
      • 소스 코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정과 그 결과. 예를 들어 Java 프로젝트를 진행한다면 .java 파일과 여러가지 정적 파일등에 해당하는 resource가 존재한다. 빌드를 한다면 소스코드를 컴파일해서 .class로 변환하고 resource를 .class에서 참조할 수 있는 적절한 위치로 옮기고 META-INF와 MANIFEST.MF 등을 하나로 압축하는 과정을 의미.
      • 빌드에서는 컴파일, 테스트, 배포 등 과정이 포함. 컴파일은 빌드의 부분집합이라고 생각하면 됨. (컴파일은 소스코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 작업)
      • 즉, 컴파일된 코드를 실제 실행할 수 있는 상태로 만드는 일을 Build라고 한다.
  • .jar 파일 의미
    • 인용 사이트
    • JAR(Java Archive)는 여러 개의 자바 클래스 파일과 클래스들이 이용하는 관련 리소스 등 메타데이터를 하나의 파일로 모은다. 그 후 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷이다.
    • 사용자는 JDK에 포함된 jar 명령어를 이용하여 jar파일을 만들거나 압축을 풀 수 있다.



2. 스프링 웹 개발 기초

정적 컨텐츠

키워드

  • 정적 컨텐츠(HTML 그대로)
  • MVC(Model View Controller)와 템플릿 엔진(HTML 동적으로)
  • API(json 데이터 포멧으로 전달)


MVC와 템플릿 엔진

키워드

  • @RequestParam(“name”) String name


API

키워드

  • @ResponseBody
  • 객체를 json으로 반환

의문점

  • JSON은?
    • JavaScript Object Notation라는 의미의 축약어로 데이터를 저장하거나 전송할 때 많이 사용되는 경량의 DATA 교환 형식. 자바스크립트 객체 표기법과 아주 유사.
    • JSON 형식은 자바스크립트 객체와 마찬가지로 key / value가 존재할 수 있으며 key값이나 문자열은 항상 쌍따옴표를 이용하여 표기해야한다.
    • JSON은 데이터 포맷일 뿐이며 어떠한 통신 방법도, 프로그래밍 문법도 아닌 단순히 데이터를 표시하는 표현 방법일 뿐이다.



3. 회원 관리 예제 - 백엔드 개발

비지니스 요구사항 정리

키워드

  • 웹 애플리케이션 계층 구조(컨트롤러, 서비스, 리포지토리, 도메인)


회원 도메인과 리포지토리 만들기

의문점

  • Optional은? ofNullable()은?
    • 자바 8부터 추가됨
    • Optional는 “존재할 수도 있지만 안 할 수도 있는 객체”, 즉, “null이 될 수도 있는 객체”을 감싸고 있는 일종의 wrapper 클래스(직접 다루기에 위험하고 까다로운 null을 담을 수 있는 특수한 그릇)
    • null과 관련된 문제들
      • 런타임에 NPE(NullPointerException)라는 예외를 발생
      • NPE 방어를 위해서 들어간 null 체크 로직 때문에 코드 가독성과 유지 보수성이 떨어짐.
    • Optional의 효과
      • NPE를 유발할 수 있는 null을 직접 다루지 않아도 됨.
      • 수고롭게 null 체크를 직접 하지 않아도 됨.
    • ofNullable()
      • null인지 아닌지 확신할 수 없는 객체를 담고 있는 Optional 객체를 생성. null이 넘어올 경우, NPE를 던지지 않고 비어 있는 Optional 객체를 얻어옴. 해당 객체가 null인지 아닌지 자신이 없는 상황에서는 이 메소드를 사용해야 함.
  • stream 사용 이유
    • Stream API는 데이터를 추상화하고 처리하는 데 자주 사용되는 함수들을 정의해 둠. 여기서 데이터를 추상화하였다는 것은 데이터의 종류에 상관 없이 같은 방식으로 데이터를 처리할 수 있다는 것을 의미하며, 그에 따라 재사용성을 높일 수 있다.
    • Stream API를 활용하면 코드의 라인수도 줄이고, 가독성도 높일 수 있다.
    • 원본의 데이터를 변경하지 않는다. 즉 원본의 데이터로부터 읽기만 할 뿐이며, 정렬이나 필터링 등의 작업은 별도의 Stream 요소들에서 처리가 된다.
  • Stream의 filter()와 findAny()는?
    • filter(): 인자로 함수를 받으며, 함수를 구현하여 필터링하는 조건을 설정. 조건에 맞는 요소들을 모두 필터링한다.
    • findAny(): 조건에 일치하는 요소 중 가장 먼저 탐색되는 요소 1개를 리턴.


회원 리포지토리 테스트 케이스 작성

키워드

  • 테스트 주도 개발(test-driven development, TDD)


회원 서비스 개발

의문점

  • final 변수인데 조작한다고?
    • final 변수는 초기화 이후 값 변경이 발생하지 않도록 만든다. 예로 List에 final을 선언하여 list 변수의 변경은 불가능하다. 하지만 list 내부에 있는 변수들은 변경이 가능하여 문자열을 계속 추가할 수 있다.
    • 따라서, final 변수의 변경을 막아주지만 final 변수 내부에 갖고 있는 변수들은 변경이 가능하다.


회원 서비스 테스트

키워드

  • 테스트 사고흐름(given, when, then)
  • 의존관계 주입(Dependency Injection, DI)

의문점

  • static import란?
    • 정적(static) 메소드와 변수를 더욱 쉽게 사용하기 위해서 static import 를 지원.
    • static import한 후에 클래스명 없이 정적 메소드와 정적 변수를 사용할 수 있음.
  • DI란
    • 의존관계(A가 B를 의존한다): 의존대상 B가 변하면, 그것이 A에 영향을 미친다. 즉, B의 기능이 추가 또는 변경되거나 형식이 바뀌면 그 영향이 A에 미친다.
    • 의존관계를 외부에서 결정하고 주입하는 것이 DI(의존관계 주입)이다.
    • 예시는 강의영상 참고



스프링 빈과 의존관계

컴포넌트 스캔과 자동 의존관계 설정

키워드

  • 스프링 컨테이너와 컨트롤러(스프링 빈)
  • 스프링 빈 등록(컴포넌트 스캔 / @Controller, @Service, @Repository)
  • @Autowired(DI, 의존성 주입)
  • 싱글톤


자바 코드로 직접 스프링 빈 등록하기

키워드

  • @Configuration, @Bean
  • DI 방법(필드 주입, setter 주입, 생성자 주입)



회원 관리 예제 - 웹 MVC 개발

회원 웹 기능 - 홈 화면 추가


회원 웹 기능 - 등록

키워드

  • html(form, input 태그)
  • get과 post방식

의문점

  • get과 post 방식은?
    • HTTP 요청 메서드
      • URL을 이용하면 서버에 특정 데이터를 요청할 수 있다. 여기서 요청하는 데이터에 특정 동작을 수행하고 싶으면 어떻게 해야 할까요? 바로 HTTP 요청 메서드(Http Request Methods)를 이용.
      • 일반적으로 HTTP 요청 메서드는 HTTP Verbs라고도 불리우며 아래와 같이 주요 메서드를 갖고 있습니다. 이와 같이 데이터에 대한 조회, 생성, 변경, 삭제 동작을 HTTP 요청 메서드로 정의 가능.
      • PUT,DELETE도 post방식으로 가능. 사실 대부분 GET,POST방식만 사용.
        • GET : 존재하는 자원에 대한 요청
        • POST : 새로운 자원을 생성
        • PUT : 존재하는 자원에 대한 변경
        • DELETE : 존재하는 자원에 대한 삭제
    • GET
      • GET은 요청을 전송할 때 필요한 데이터를 Body에 담지 않고, 쿼리스트링을 통해 전송.
      • 쿼리스트링: URL의 끝에 ?와 함께 이름과 값으로 쌍을 이루는 요청 파라미터. 만약 요청 파라미터가 여러 개이면 &로 연결(ex- www.example-url.com/resources?name1=value1&name2=value2)
      • GET은 불필요한 요청을 제한하기 위해 요청이 캐시될 수 있다. js, css, 이미지 같은 정적 컨텐츠는 데이터양이 크고, 변경될 일이 적어서 반복해서 동일한 요청을 보낼 필요가 없다. 정적 컨텐츠를 요청하고 나면 브라우저에서는 요청을 캐시해두고, 동일한 요청이 발생할 때 서버로 요청을 보내지 않고 캐시된 데이터를 사용.
    • POST
      • POST는 리소스를 생성/변경하기 위해 설계되었기 때문에 GET과 달리 전송해야될 데이터를 HTTP 메세지의 Body에 담아서 전송한다. HTTP 메세지의 Body는 길이의 제한없이 데이터를 전송할 수 있다. 그래서 POST 요청은 GET과 달리 대용량 데이터를 전송할 수 있다
      • POST로 요청을 보낼 때는 요청 헤더의 Content-Type에 요청 데이터의 타입을 표시해야 한다. Content-Type의 종류로는 application/x-www-form-urlencoded, text/plain, multipart/form-data 등이 있다.
      • 데이터 타입을 표시하지 않으면 서버는 내용이나 URL에 포함된 리소스의 확장자명 등으로 데이터 타입을 유추한다. 만약, 알 수 없는 경우에는 application/octet-stream로 요청을 처리한다.


회원 웹 기능 - 조회

키워드

html(table 관련 태그)

의문점

  • MVC란?
    • MVC 는 Model, View, Controller의 약자다. 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성요소를 세가지의 역할로 구분한 패턴이다.
    • 모델
      • 데이터를 가진 객체를 모델이라고 지칭한다. 모델의 상태에 변화가 있을 때 컨트롤러와 뷰에 이를 통보한다. 이와 같은 통보를 통해 뷰는 최신의 결과를 보여줄 수 있고, 컨트롤러는 모델의 변화에 따른 적용 가능한 명령을 추가, 제거, 수정할 수 있다.
      • 모델의 규칙
        • 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야만 함
        • 뷰나 컨트롤러에 대해서 어떠한 정보도 알지 말아야 함
        • 변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야 함
      • View는 클라이언트 측 기술인 HTML/CSS/Javascript들을 모아둔 컨테이너이다. 사용자 인터페이스 요소를 나타낸다. 사용자가 볼 결과물을 생성하기 위해 모델로부터 정보를 얻어온다.
      • 뷰의 규칙
        • 모델이 가지고 있는 정보를 따로 저장해서는 안됨
        • 모델이나 컨트롤러와 같이 다른 구성 요소를 몰라야 함
        • 변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야 함
    • 컨트롤러
      • 데이터와 사용자 인터페이스 요소들을 잇는 다리역할. 사용자가 데이터를 클릭하고, 수정하는 것에 대한 “이벤트”들을 처리하는 부분.
      • 컨트롤러의 규칙
        • 모델이나 뷰에 대해서 알고 있어야 한다.
        • 모델이나 뷰의 변경을 모니터링 해야 한다.



스프링 DB 접근 기술

H2 데이터베이스 설치

의문점

  • JDBC란?
    • 자바 언어로 다양한 종류의 관계형 데이터베이스에 접속하고 SQL문을 수행하여 처리하고자 할 때 사용되는 표준 SQL 인터페이스 API이다.
    • JDBC 인터페이스: JDBC 프로그램을 하기 위한 API들로서, Java SE(Standard Edition)에서 제공하는 java.sql 패키지를 의미한다. JDBC 프로그램을 구현할 때 실제로 사용하는 객체들은 대부분 몸체가 없는 인터페이스 이다.
    • JDBC 드라이버: 실제 DB관련 기능이 동작하려면 이 인터페이스 만으로는 작업할 수 없다. 그렇기 떄문에 java.sql의 인터페이스들을 상속하여 메소드의 몸체를 구현한 클래스 파일들이 필요하며 이 파일들을 JDBC 드라이버라고 한다.


순수 JDBC

키워드

  • 개방-폐쇄 원칙(OCP, Open-Closed Principle)
  • DI (Dependencies Injection)


스프링 통합 테스트

키워드

  • @SpringBootTest, @Transactional(테스트 케이스, rollback)


스프링 JdbcTemplate


JPA

키워드

  • @Entity
  • 어노테이션으로 데이터베이스와 매핑
  • IDENTITY 전략(기본 키 생성을 데이터베이스에 위임하는 전략)
  • JPQL(Java Persistence Query Language / 테이블이 아닌 엔티티 객체를 대상으로 검색하는 객체지향 쿼리)

의문점

  • JPA란
    • JPA(Java Persistence API). 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음. 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스. 인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현함
    • ORM(Object-Relational Mapping): 애플리케이션 Class와 RDB(Relational DataBase)의 테이블을 매핑(연결)한다는 뜻이며, 기술적으로는 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이라고 보면된다.
    • 사용 이유: JPA는 반복적인 CRUD SQL을 처리해준다. JPA를 사용하여 얻을 수 있는 가장 큰 것은 SQL아닌 객체 중심으로 개발할 수 있다는 것이다. 이에 따라 당연히 생산성이 좋아지고 유지보수도 수월하다.
  • JPA와 JDBC의 차이점


스프링 데이터 JPA



AOP

AOP가 필요한 상황

키워드

  • 메소드의 호출 시간 측정
  • 공통 관심 사항(cross-cutting concern)과 핵심 관심 사항(core concern)


AOP 적용

키워드

  • AOP(Aspect Oriented Programming, 관점 지향 프로그래밍),
  • @Aspect, @Around
  • 프록시 방식 AOP

의문점

  • 프록시 방식 AOP란?
    • AOP: 문제를 해결하기 위한 핵심 관심 사항과 전체에 적용되는 공통 모듈 사항을 기준으로 프로그래밍 함으로써 공통 모듈을 여러 코드에 쉽게 적용할 수 있도록 도와주는 역할.
    • AOP 용어
      • Advice:
        • 언제 공통 관심 기능을 핵심로직에 적용할 지를 정의함.
        • @Around (메소드 실행 전 후): 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출 전, 후 어드바이스 기능을 수행
        • @Before : 어드바이스 타겟 메소드가 호출되기 전에 어드바이스 기능을 수행
        • @After : 타겟 메소드의 결과에 관계없이(성공, 예외 상관없이) 타겟 메소드가 완료되면 어드바이스 기능 수행
      • Joinpoint: Advice를 적용 가능한 지점을 의미함. 메소드호출, 필드값 변경 등이 Joinpoint에 해당.
      • Pointcut: Joinpoint의 부분집합으로서 실제로 Advice가 적용되는 Joinpoint를 나타냄. 스프링에서는 정규 표현식이나 AspectJ의 문법을 이용하여 Poincut을 재정의 가능.
      • Weaving: Advice를 핵심로직코드에 적용하는 것. 즉 공통코드를 핵심로직코드에 삽입하는 것.
      • Aspect: 여러 객체에 공통으로 적용되는 기능. 트랜잭션이나, 보안 등이 Aspect의 좋은 예다.
    • Spring AOP: 스프링은 자체적으로 프록시 기반의 AOP를 지원함. 따라서 스프링 AOP는 메서드 호출 Joinpoint만을 지원함. 필드 값 변경과 같은 Joinpoint를 사용하고 싶다면 AspectJ와 같이 다양한 Joinpoint를 지원하는 AOP프레임워크를 사용해야 한다.
    • 프록시 Proxy: 타겟을 감싸서 타겟의 요청을 대신 받아주는 랩핑(Wrapping) 오브젝트. 클라이언트에서 타겟을 호출하면, 타겟을 감싸고 있는 프록시가 호출되어, 어드바이스에 등록된 기능을 수행 후 타겟 메소드를 호출한다.