Java 프레임워크 학습(1) JavaWeb 기초: Maven, Spring, Tomcat, Mybatis, Springboot

기사 디렉토리

메이븐

Maven은 프로젝트 객체 모델(Project Object Model, pom 파일), 프로젝트 라이프사이클(명령어), 종속성 관리 시스템(좌표)을 포함하는 프로젝트 관리 도구입니다.

Maven 사용의 이점:
1. 프로젝트용 모듈 구축이 편리하고, 프로젝트 구조를 단순화하며, 노동 분업 개발을 촉진하고, 개발 효율성을 향상시킵니다.
2. Maven은 다양한 시스템의 종속성을 통합된 방식으로 관리할 수 있으며 종속성을 전송 및 상속할 수 있어 프로젝트 업그레이드에 편리합니다.
3. Maven에는 여러 개의 jar 패키지를 하나의 jar 패키지로 묶는 데 사용되는 maven-shade, 소스 코드를 컴파일하는 데 사용되는 maven-compiler-plugin 등 기능 확장에 편리한 플러그인도 많이 있습니다. 프로젝트 등의

메이븐 저장소

Maven Warehouse는 리소스를 저장하고 다양한 jar 패키지를 관리하는 데 사용됩니다.

창고는 세 가지 유형으로 나뉩니다.

  1. 중앙 창고: Maven 팀이 관리하는 세계 유일의 창고
  2. 로컬 창고: 자신의 컴퓨터에 있는 디렉토리
  3. 원격 창고: 일반적으로 회사 팀이 구축한 개인 창고

메이븐 좌표

  • groupId : 현재 Maven 프로젝트가 속한 조직의 이름을 정의하는 조직 ID(일반적으로 도메인 이름을 거꾸로 사용함, 예: com.qjk)
  • ArtifactId: 현재 Maven 프로젝트 이름을 정의하는 프로젝트 ID(일반적으로 주문 서비스, 상품 서비스 등의 모듈 이름)
  • version : 현재 프로젝트 버전 번호를 정의합니다.
  • Packaging: Maven 프로젝트를 패키징하는 방법을 정의하며 패키징이 없는 경우 기본값은 jar 패키지입니다.
  • classifier : 이 요소는 빌드 출력에 대한 일부 첨부 파일을 정의하는 데 사용됩니다. 보조 구성 요소는 주요 구성 요소에 해당합니다.

Maven이 종속성 관리를 수행하지만 여전히 종속성 충돌이 발생하는 이유는 무엇입니까? 종속성 충돌을 처리하는 방법은 무엇입니까?

종속성 충돌 이유:

  1. 전이적 종속성은 다양한 버전의 jar 패키지 간에 충돌을 일으키며, Maven은 근접성 원칙을 채택하여 종속성 경로가 긴 jar 패키지를 제외하므로 ClassNotFound이러한 오류가 발생합니다.
  2. 다른 jar 패키지에는 동일한 클래스 경로가 있습니다.

jar 패키지 충돌에 대한 해결 방법:

  • 아이디어는 Maven Helper 플러그인을 따라 충돌하는 jar 패키지를 분석하는 데 도움이 될 수 있습니다.
  • Ctrl + Shift + Alt + n을 사용하여 클래스 경로가 있는 jar 패키지를 찾고 해당 jar 패키지를 pom에서 제외합니다.

범위 종속성 범위에 대해 자세히 설명

  • compile: 런타임 동안 유효하고 패키지에 포함되어야 하는 기본 범위
  • 테스트: 테스트 프로그램에서만 유효하며 패키지에는 포함되지 않습니다.
  • 제공됨: 컴파일 중에 유효하며 런타임 중에 제공할 필요가 없으며 패키지에 포함되지 않습니다.
  • 런타임: 컴파일 중에는 필요하지 않으며 런타임 중에 유효하며 패키지에 포함되어야 합니다.

여기에 이미지 설명을 삽입하세요

메이븐의 생명주기

Maven의 라이프사이클은 모든 Maven 프로젝트의 구축 프로세스를 추상화하고 통합하는 것입니다.
이 아이디어에서 우리는 다음 5단계(순서대로)에 집중하게 됩니다.

  • clean: 이전 빌드에서 생성된 파일을 제거합니다.
  • compile: 프로젝트 소스 코드를 컴파일합니다.
  • 테스트: Junit과 같은 테스트에 적합한 단위 테스트 프레임워크를 사용합니다.
  • package: 컴파일된 파일을 jar 또는 war 패키지로 패키징합니다.
  • 설치: 프로젝트를 로컬 창고에 설치합니다.

참고: 동일한 라이프사이클 세트에서 이후 단계가 실행되면 이전 단계가 실행됩니다.
여기에 이미지 설명을 삽입하세요

아이디어의 라이프사이클 아래 라이프사이클의 특정 단계를 클릭하면 실제로 해당 Maven 플러그인에 의해 완료됩니다.
여기에 이미지 설명을 삽입하세요

메이븐 고급

하위 모듈 설계

모듈식 설계는 개발 과정에서의 노동 분담, 이후 프로젝트의 관리, 확장 및 유지 관리, 그리고 다른 프로젝트의 기존 모듈 기능 통합을 용이하게 합니다. 통합할 때 해당 Maven 종속성만 도입하면 됩니다.
여기에 이미지 설명을 삽입하세요

상속하다

서로 다른 모듈에 동일한 종속성을 도입해야 할 수 있으므로 모듈의 공개 종속성을 추출하고 상위 프로젝트를 빌드할 수 있으며, 이 종속성이 필요한 다른 하위 모듈은 상위 프로젝트의 종속성만 상속하면 됩니다.

여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

Maven 프로젝트의 상속은 Java의 상속과 유사하며 다중 상속이 허용되지 않습니다. 즉, 모듈 프로젝트는 하나의 상위 프로젝트만 상속할 수 있습니다.

팁: 패키징 방법 요약:
여기에 이미지 설명을 삽입하세요
따라서 Maven을 사용하여 프로젝트 상속 관계를 구현할 때 pom 메서드를 사용하여 패키징해야 합니다.
레이블을 사용하여 <packaging> pom </packaging>지정하지 않으면 기본값은 jar 패키지입니다.
여기에 이미지 설명을 삽입하세요
상속 관계 구현:
여기에 이미지 설명을 삽입하세요

여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

버전 잠금

상위 프로젝트에서는 < dependencyManagement > 태그를 통해 종속성 버전을 일률적으로 관리하므로 하위 프로젝트에서는 버전 번호를 지정할 필요가 없으며, 버전을 변경해야 하는 경우에는 해당 프로젝트에서만 일률적으로 변경하면 된다. 상위 프로젝트.
여기에 이미지 설명을 삽입하세요
< 종속성 > 태그는 직접 종속성이므로 상위 프로젝트에 태그가 구성된 경우 하위 프로젝트가 이를 직접 상속합니다.

< dependencyManagement >는 직접 종속되지 않는 통합 종속성 관리 버전으로, 하위 프로젝트에 이 종속성이 필요한 경우 pom 파일에 도입해야 하지만 버전 번호를 지정할 필요가 없으며 버전도 상위 프로젝트에 지정된 번호가 사용됩니다.
여기에 이미지 설명을 삽입하세요

그러나 상위 프로젝트에서는 버전 태그를 중앙에서 관리하기 위해 각 종속성의 버전 번호도 각 종속성의 버전 태그에 분산되어 있습니다. Maven에서 제공하는 기능을 사용할 수 있습니다 自定义属性和引用属性.

여기에 이미지 설명을 삽입하세요

중합

집계의 목적은 여러 모듈을 전체로 구성하여 Maven의 수명 주기 작업(예: 클린 컴파일 테스트 설치 패키지)을 한 번의 클릭으로 실행할 수 있도록 하는 것입니다.
여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

Maven의 상속과 집계의 유사점과 차이점

여기에 이미지 설명을 삽입하세요

개인 서버

개인 서버는 회사 내에서 균일하게 관리되는 Maven 종속성 라이브러리입니다.
여기에 이미지 설명을 삽입하세요
이 프로세스는 Github 원격 저장소와 유사합니다. . .
여기에 이미지 설명을 삽입하세요
1단계: 개인 서버 액세스를 위한 사용자 이름과 비밀번호를 설정합니다. 서버 레이블을 사용합니다.
여기에 이미지 설명을 삽입하세요
2단계: 구성 업로드(게시) 주소를 지정합니다.
여기에 이미지 설명을 삽입하세요
3단계: 개인 서버가 다운로드에 의존하는 창고 그룹의 주소 설정

동시에 개인 서버로부터의 다운로드도 허용하도록 설정되어 있습니다. (기본적으로 스냅샷 버전은 개인 서버에서 다운로드할 수 없습니다.)
여기에 이미지 설명을 삽입하세요

수코양이

Tomcat은 웹 컨테이너, 서블릿 컨테이너로도 알려진 경량 웹 서버입니다. 웹 서버는 HTTP 프로토콜 작업을 캡슐화하고 웹 프로그램 개발을 단순화하며 웹 프로젝트 배포에 사용되며 온라인 정보 검색 서비스를 제공합니다.

서블릿

계층화된 디커플링

3계층 아키텍처

단일 책임 원칙을 기반으로 3계층 아키텍처를 채택하여 비즈니스 데이터 액세스, 논리 처리 및 응답의 백엔드 기능을 완성합니다.

  • 컨트롤러(Controller): 프런트엔드에서 보낸 요청을 수신하고, 요청을 처리하고, 데이터에 응답하는 컨트롤 레이어입니다.
  • 서비스: 특정 비즈니스 로직을 처리하는 비즈니스 로직 계층입니다.
  • Dao: (데이터 액세스 개체, 데이터 액세스 개체 계층), 데이터베이스 추가, 삭제, 확인 및 수정을 포함한 데이터 액세스 작업을 담당합니다.

여기에 이미지 설명을 삽입하세요
3계층 아키텍처의 개념에 따르면 프런트엔드 요청은 먼저 컨트롤러 계층을 통과하고 요청을 받은 후 서비스 계층을 통해 논리적 처리를 수행합니다. 서비스 계층에서 논리적으로 처리된 개체는 데이터 개체를 얻어야 합니다. Dao 레이어를 통해 비즈니스 작업이 완료된 후 Controller 레이어는 프런트 엔드에 데이터에 응답합니다.
여기에 이미지 설명을 삽입하세요

IOC(제어 반전) 및 DI(종속성 주입)

3계층 아키텍처로 작성된 코드에 따르면 중간 서비스 계층은 상위 Controller 계층 및 하위 Dao 계층과 각각 결합됩니다.
여기에 이미지 설명을 삽입하세요

계층화된 디커플링을 달성하기 위해 Spring은 제어 반전(IOC) 및 종속성 주입(DI) 기술을 제공합니다.

제어 역전은 개체를 컨테이너 관리로 전송하고, 종속성 주입은 개체를 사용해야 하는 곳에 개체를 주입합니다.
여기에 이미지 설명을 삽입하세요

  • IOC(Inversion of Control): 객체 생성 제어가 프로그램에서 외부(컨테이너)로 이전됩니다.
  • DI(종속성 주입): 컨테이너는 런타임 시 애플리케이션이 의존하는 리소스를 제공합니다.
  • 컨테이너에서 생성되고 관리되는 객체를 객체라고 합니다.bean

구체적인 구현 프로세스:

  1. 주석을 사용하여 @Component서비스 계층과 dao 계층의 구현 클래스를 IOC 컨테이너에 넘겨 관리합니다.
  2. 컨트롤러 계층이 서비스 계층의 구현 클래스에 의존해야 하는 경우와 서비스 계층이 dao 계층의 구현 클래스에 의존해야 하는 경우 @Autowired주석을 사용합니다.

여기에 이미지 설명을 삽입하세요

IOC에 대한 자세한 설명

IOC는 객체를 컨테이너 관리에 넘겨주는 것인데 실제 개발에서는 위에서 사용한 Annotation 외에도 Controller Layer, Service Layer, Dao Layer에 각각 해당하는 , , 와 같은 Annotation @Component실제로 더 많이 사용하고 있다 .@Controller@Service@Repository

@ServiceAnnotation을 보면 @ComponentAnnotation과 Meta-Annotation으로 구성되어 있어 사실상 Component의 파생된 Annotation임을 알 수 있다.
여기에 이미지 설명을 삽입하세요

  • Annotation을 사용하면 컨테이너에 Java Bean 객체가 선언됩니다. Bean을 선언할 때 value 속성을 통해 Bean의 이름을 지정할 수 있습니다. 지정하지 않을 경우 기본값은 클래스 이름의 첫 글자 소문자입니다.
  • 위의 4가지 Annotation을 이용하여 Bean을 선언할 수 있으나 springboot 통합 웹 개발에서는 Bean으로 선언된 컨트롤러만 사용할 수 있으며, @ControllerAnnotation은 and가 @RestController통합된 복합 Annotation 이므로 다음의 Bean을 선언하는데도 사용할 수 있다. 컨트롤러 유형 개체.@Controller@Requestbody

빈 구성요소 스캐닝

  • @ComponentScan선언된 Bean의 네 가지 주요 주석이 적용되려면 주석을 검색하는 구성 요소를 통해 검색 해야 합니다 .
  • @ComponentScan주석에 구성이 표시되지는 않지만 실제로는 시작 클래스 선언 주석에 포함되어 있습니다 @SpringBootApplication.기본 스캔 범위는 시작 클래스가 있는 패키지와 해당 하위 패키지입니다.

시작 클래스가 위치한 패키지 외부에서 Bean 컴포넌트를 스캔하려면 시작 클래스에서 Annotation을 사용해야 하며 @ComponentScan매개변수는 패키지 이름입니다. Annotation을 사용하면 @ComponentScan기본 Annotation이 무효화되므로 다시 확인해야 합니다. - 시작 클래스가 있는 패키지를 지정합니다.

DI에 대한 자세한 설명

DI 의존성 주입 @Autowired어노테이션은 컨테이너로부터 타입에 따라 해당하는 빈 객체를 얻기 위한 것으로, 동일한 타입의 빈이 여러 개 있을 경우 오류가 발생하므로
여기에 이미지 설명을 삽입하세요
다음 해결 방법을 통해 해결하세요.

  • @Primary: 동일한 유형의 주석이 여러 개 있는 경우 이 주석으로 선언된 Bean 객체가 먼저 주입됩니다.
  • @Qualifier: 이 주석을 @autowired 주석과 함께 사용하여 Bean의 이름을 지정합니다.
  • @Resource: 빈 이름을 지정하려면 이 주석만 사용하세요.

여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

@Autowired주석과 의 차이점 @Resource:

  • @AutowiredSpring Framework에서 제공하는 Annotation @Resource이지만
  • @Autowired기본값은 타입별로 주입하는 @Resource것이지만 기본적으로는 이름으로 주입한다.

내 신발

  • MyBatis는 뛰어난 지속성 레이어 프레임워크입니다.
  • MyBatis는 거의 모든 JDBC(Java Database Connect) 코드와 매개변수를 수동으로 설정하고 결과 세트를 얻는 프로세스를 방지합니다.
  • MyBatis는 간단한 XML 또는 주석을 사용하여 기본 정보를 구성 및 매핑하고 인터페이스 및 Java 엔터티 클래스(Plain Old Java Objects, 일반 Java 개체)를 데이터베이스의 레코드에 매핑할 수 있습니다.
  • MyBatis는 원래 apache인 ibatis의 오픈소스 프로젝트였으나, 2010년에 이 프로젝트는 apache에서 Google 코드로 마이그레이션되어 MyBatis로 이름이 변경되었습니다.
  • 마이바티스 공식 문서: http://www.mybatis.org/mybatis-3/zh/index.html
  • GitHub : https://github.com/mybatis/mybatis-3

구성 프로세스

여기에 이미지 설명을 삽입하세요
@Mapper주석은 컨테이너에 있는 인터페이스의 구현 클래스를 관리하므로 인터페이스의 구현 클래스 개체를 사용하려면 구현 클래스 개체를 선언하고 주석을 사용하여 자동으로 주입하면 됩니다. @Autowired주석 에 의해 선언된 객체입니다 Mapper.

JDBC(Java 데이터베이스 연결)

여기에 이미지 설명을 삽입하세요
전통적인 jdbc 작업은 데이터를 가져올 때 캡슐화, 데이터베이스에 대한 연결 설정 등 반복적인 코드 블록이 많으며, Mybatis의 역할은 프로그래머가 프레임워크를 기반으로 데이터베이스에 데이터를 저장하고 데이터베이스에서 데이터를 가져올 수 있도록 돕는 것입니다.

여기에 이미지 설명을 삽입하세요

데이터베이스 연결 풀

여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

롬복 툴킷

주석을 통해 @Data엔터티 클래스 작성을 단순화합니다 .
여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

마이바티스의 기본 동작

Mybatis에서 SQL 문을 구성하는 방법에는 두 가지가 있습니다.

  • 주석 기반
  • XML 기반 매핑 파일

삭제

여기에 이미지 설명을 삽입하세요

미리 컴파일된 SQL

  • 미리 컴파일된 SQL은 성능이 더 좋습니다. 예를 들어 동일한 SQL에 대해 매개변수만 다릅니다. 미리 컴파일된 SQL을 사용하면 SQL을 캐시하고 캐시를 적용하여 매개변수를 대체하고 직접 실행할 수 있습니다. 캐시를 사용하면 SQL 구문 분석 검사, SQL 최적화 및 SQL 컴파일을 건너뛸 수 있으므로 성능이 더 높아집니다.
  • SQL 주입을 방지하여 더욱 안전해집니다.SQL 인젝션은 미리 정의된 SQL문을 수정하여 입력 데이터를 조작하여 서버를 공격하는 코드를 실행시키는 방식이다.

여기에 이미지 설명을 삽입하세요

SQL 주입 공격 사례:
로그인에 입력: 계정 이름은 임의, 비밀번호는 'or '1' = '1'
여기에 이미지 설명을 삽입하세요
백그라운드에서 확인할 때:
여기에 이미지 설명을 삽입하세요
==또는 '1' = '1'==이 항상 성립되는 것을 볼 수 있으므로 자연스럽게 언제든지 로그인할 수 있습니다. 성공적으로!

매개변수 자리 표시자를 사용하는 것 외에도 자리 표시자를 #사용할 수도 있으며 $차이점은 다음과 같습니다.
여기에 이미지 설명을 삽입하세요

추가하다

여기에 이미지 설명을 삽입하세요
기본 키 반환: 주석을
사용하고 @OptionsuseGeneratedKeys = true로 기본 키를 id 속성에 할당합니다.
여기에 이미지 설명을 삽입하세요

개정하다

여기에 이미지 설명을 삽입하세요

문의

데이터 캡슐화:
여기에 이미지 설명을 삽입하세요
엔터티 클래스의 속성 이름이 필드 이름과 일치하지 않는 경우 필드 값을 클래스의 속성 값으로 자동으로 캡슐화할 수 없습니다.

해결책은 다음과 같습니다.

  1. 해결 방법 1: 별칭이 엔터티 클래스의 속성과 일치하도록 필드에 별칭을 지정합니다.
  2. 해결 방법 2: @Result 주석을 통해 수동으로 매핑 및 캡슐화
  3. 해결 방법 3: 스프링 구성 파일( application.properties)에서 mybatis hump 이름 지정의 자동 매핑 스위치를 활성화합니다.mybatis.configuration.map-underscore-to-camel-case =true

여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

퍼지 쿼리에서 와일드카드를 사용할 경우 %작은따옴표 스플라이싱을 사용해야 하며, 사용된 와일드카드는 따옴표 안에 존재할 수 없으며 , 제공되는 SQL 사전컴파일 기능을 #계속 사용하려면 문자 스플라이싱 방식을 사용한다.#concat

여기에 이미지 설명을 삽입하세요

XML 매핑 파일

XML 매핑 파일을 사용하여 SQL을 구성할 수도 있습니다.
여기에 이미지 설명을 삽입하세요
명세에 따라 작성된 XML 파일을 정상적으로 찾아 그 안에 있는 SQL 문을 실행할 수 있다.

mybatis 주석의 사용은 주로 추가, 삭제, 수정 및 쿼리와 같은 몇 가지 간단한 기능을 완료하는 것입니다. 복잡한 SQL 기능을 구현해야 하는 경우 XML을 사용하여 SQL 문을 구성하는 것이 좋습니다.

마이바티스 동적 SQL

사용자 입력이나 외부 조건의 변경에 따라 변경되는 SQL 문을 동적 SQL이라고 합니다.

동적 SQL 작성은 주로 일부 레이블 문에 의존합니다.

  • < if >: 조건이 참인지 판단하는 데 사용되며, 조건을 판단하려면 test 속성을 사용하고, 조건이 참이면 SQL을 접합합니다.
  • < where > : where 요소는 하위 요소에 내용이 있는 경우에만 where 절을 삽입하고 절 시작 부분에서 자동으로 and 또는 or를 제거합니다.

여기에 이미지 설명을 삽입하세요

  • < set > : 줄 시작 부분에 set 키워드를 동적으로 삽입하고 추가 쉼표를 제거합니다. (업데이트 문에 사용됨)
    여기에 이미지 설명을 삽입하세요
  • < foreach >:
    • collection: 순회할 컬렉션
    • 항목: 통과된 요소
    • 구분 기호: 구분 기호
    • open: 순회가 시작되기 전에 연결되는 SQL 조각
    • close: 순회 후 접합된 SQL 조각 이
      태그는 피로 삭제의 다음 예와 같이 일괄 작업이 필요한 시나리오에서 주로 사용됩니다.
      여기에 이미지 설명을 삽입하세요
  • <sql> 및 <include> : SQL 조각의 반복 사용 횟수가 많은 경우 <sql> 태그를 사용하여 빈도가 높은 반복 태그를 추출하고 id 이름을 설정하여 사용할 수 있습니다. include> 태그를 추가하고 refid를 id 이름, 참조 대체로 설정합니다.

여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

편안한 스타일 API

표현 상태 전송(Representation State Transfer), 표현 상태 전환, 소프트웨어 아키텍처 스타일.
여기에 이미지 설명을 삽입하세요
URL을 사용하여 리소스를 찾고 HTTP 동사(요청 방법)를 사용하여 작업을 설명합니다.

  • 쿼리: 가져오기
  • 추가됨: 게시물
  • 수정: 넣다
  • 삭제: 삭제

속성 구성 파일

매개변수 구성

application.properties 파일에 구성정보 속성값을 설정하고, @ValueJava 파일에 Annotation을 통해 외부 구성파일의 속성값을 주입한다.
여기에 이미지 설명을 삽입하세요

yml 구성 파일

yml 또는 yaml 형식의 구성 파일을 사용하는 것이 더 간결하고 계층 구조가 더 명확합니다.
여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

여기에 이미지 설명을 삽입하세요

구성속성

주입된 구성 속성을 사용하는 @Value것은 지루한 일입니다. 이 단계를 단순화할 수 있는 가능성이 있습니까?
여기에 이미지 설명을 삽입하세요
주석을 통해 @ConfigurationProperties구성 파일의 속성 값이 개체에 주입됩니다.
여기에 이미지 설명을 삽입하세요
Maven에 종속성을 추가할 수 있습니다.
여기에 이미지 설명을 삽입하세요

사례 구현 - 로그인 확인

서버는 요청을 받으면 로그인 상태인지 확인하여 로그인 상태이면 정상적으로 처리하고, 로그인 상태가 아니면 차단합니다.

서버는 일반적으로 로그인 인증 기능 구현을 위해 통일된 차단 방식을 채택하고 로그인 여부를 표시합니다.

여기에 이미지 설명을 삽입하세요

대화 기술

여기에 이미지 설명을 삽입하세요

쿠키

쿠키: 클라이언트 세션 추적 기술, http 프로토콜이 지원하는 기술 로그인이 성공하면 서버는 set-cookie로 응답하고 쿠키를 브라우저로 보냅니다. 브라우저는 쿠키를 로컬로 캐시하고 후속 요청 헤더에 쿠키가 전달됩니다. 로그인 확인 상태.

쿠키의 단점:

  • 모바일 앱을 사용할 수 없습니다.
  • 안전하지 않음. 사용자가 쿠키를 비활성화할 수 있음
  • 쿠키는 도메인을 넘을 수 없습니다.
    • 크로스 도메인은 프로토콜, IP, 포트의 세 가지 차원으로 구분됩니다.

여기에 이미지 설명을 삽입하세요

세션

세션은 서버측 세션 추적 기술로, 세션은 서버측에 저장되며 그 하위 계층은 여전히 ​​쿠키를 기반으로 합니다.

세션 추적의 원리:
브라우저 로그인 요청은 JSESSION, 즉 세션 ID를 제공하고, 서버는 set-cookie를 통해 세션 ID를 설정하고 이를 서버에 저장한 후, JSESSION이 운반하는 쿠키에서 세션 ID를 확인합니다. 요청을 보낼 때 브라우저가 서버에 저장된 것과 일치하는지 여부는 세션인지 여부를 판단할 수 있습니다.

세션의 단점:
세션이 서버에 저장되기 때문에 서버 클러스터에서는 해당 세션을 사용할 수 없습니다.

토큰 기술

브라우저가 성공적으로 로그인하면 서버는 클라이언트를 위한 토큰을 생성하고 클라이언트는 토큰을 저장하며 이는 후속 요청에 전달됩니다. 동일한 세션에서 정보를 공유해야 하는 경우 해당 정보는 토큰에 저장됩니다.

이점:

  • 토큰 토큰은 쿠키에 저장되거나 클라이언트 측에 로컬로 저장될 수 있으므로 PC 및 모바일 단말기를 지원합니다.
  • 클러스터 환경의 인증 문제를 해결할 수 있습니다.

단점: 토큰 토큰을 직접 구현해야 합니다.

JWT 토큰

json 네트워크 토큰인 JWT(Json Web Token)는 두 통신 당사자 간에 json 데이터 형식으로 정보를 안전하게 전송하기 위한 간결하고 독립적인 형식을 정의합니다. 디지털 서명이 있기 때문에 이러한 메시지는 신뢰할 수 있습니다.

JWT 토큰은 주로 .두 지점으로 연결된 세 부분으로 구성됩니다.

  • 헤더(header), 레코드 토큰 유형, 서명 알고리즘
  • 일부 사용자 정의 정보, 기본 정보를 전달하는 페이로드(페이로드).
  • 시그니처(signature)는 토큰의 변조를 방지하고, 보안성을 확보하기 위해 지정된 비밀키에 헤더와 페이로드를 추가하고 지정된 서명 알고리즘을 통해 계산한다.

JWT는 원래 json인데 어떻게 문자열로 변환되나요?

base64 인코딩을 통해 소위 base64 인코딩은 64개의 문자(0-9, az, AZ, +, /)로 구성되는 인코딩 방식입니다. base64로 인코딩된 모든 데이터는 64자의 문자열로 변환됩니다.

여기에 이미지 설명을 삽입하세요
jwt 토큰의 base64 인코딩 및 디코딩은 다음 웹사이트에서 수행할 수 있습니다:
https://jwt.io/

Java 코드를 기반으로 JWT 생성:
페이로드 부분은 해시 테이블에 저장되고 생성자 모드에서 생성됩니다.
여기에 이미지 설명을 삽입하세요
생성된 JWT는 만료 시간 내에 비밀 키로 구문 분석할 수 있습니다.
여기에 이미지 설명을 삽입하세요
토큰이 만료되거나 변조되면 잘못된 것입니다!

여기에 이미지 설명을 삽입하세요

필터

필터: 일부 특수 기능을 달성하기 위해 리소스에 대한 요청을 가로채는 필터입니다. 필터는 일반적으로 로그인 확인, 유니코드 처리, 민감한 문자 처리 등과 같은 몇 가지 일반적인 작업을 수행합니다.
여기에 이미지 설명을 삽입하세요
차단 구축 단계:

  1. 필터 정의: 필터 인터페이스를 구현하고 모든 메소드를 다시 작성하기 위해 필터 클래스를 정의합니다.
  2. 필터 구성: 필터 클래스에 @WebFilter 주석을 추가하고, 차단 리소스 경로를 구성하고, @ServletComponentScan을 부팅 클래스(기본 기능이 있는 위치)에 추가하여 서블릿 구성 요소 지원을 활성화합니다.

여기에 이미지 설명을 삽입하세요

urlPatterns가로채는 요청 경로를 구성하려면 @WebFilter 주석에 속성을 추가하세요 .

필터 실행 과정에 대한 자세한 설명

Filter 인터페이스를 사용하려면 세 가지 메서드를 다시 작성해야 합니다.

  • init: 초기화, 한 번만 실행됨
  • doFilter: 요청을 가로챈 후 호출되며 여러 번 호출할 수 있으며 여기에서 해제 요청을 실행할 수 있습니다 chain.doFilter().
  • destroy: 소멸 메소드는 한 번만 호출됩니다.
    여기에 이미지 설명을 삽입하세요
    여기에 이미지 설명을 삽입하세요

필터 체인

필터 체인의 실행 순서 우선순위는 필터 클래스 이름(문자열)의 자연 순서에 따릅니다.
여기에 이미지 설명을 삽입하세요

로그인 인증 필터 프로세스

여기에 이미지 설명을 삽입하세요

인터셉터

인터셉터는 필터와 유사한 메커니즘이지만 인터셉터는 Spring 프레임워크에서 제공됩니다.
여기에 이미지 설명을 삽입하세요
Java에서 인터셉터 사용:

  1. HandlerInterceptor 인터페이스를 구현하고 메서드를 재정의하기 위해 인터셉터 클래스를 정의합니다. 인터셉터는 Spring 프레임워크에서 제공되므로 @Component주석을 직접 사용하여 관리를 위해 클래스를 컨테이너에 전달할 수 있습니다.
  2. 인터셉터 등록: @Configutation 어노테이션을 사용하여 구성 클래스를 선언하고, WebMvcConfigurer이 구성 클래스에 인터페이스를 구현하고, 어노테이션을 사용하여 위의 인터셉터 클래스를 삽입한 AutoWired다음, addInterceptors 메소드의 인터셉터 클래스에 인터셉터 경로 모드를 추가합니다.
    여기에 이미지 설명을 삽입하세요
    인터셉터 모드:
    여기에 이미지 설명을 삽입하세요

필터와 인터셉터의 차이점

  • 인터페이스 사양은 다릅니다. 필터는 Filter 인터페이스를 구현하고 인터셉터는 HandlerInterceptor 인터페이스를 구현합니다.
  • 차단 범위는 다릅니다: 필터 필터는 모든 리소스를 차단하고 인터셉터는 Spring 환경의 리소스만 차단합니다.프로젝트에 필터와 인터셉터가 모두 있는 경우 필터 필터가 먼저 실행됩니다.

여기에 이미지 설명을 삽입하세요

예외 처리

Spring 프레임워크에서는 예외가 발생하면 레이어 간에 영향을 미칩니다. 예외를 균일하게 처리하려면 전역 예외 처리기를 사용하는 것이 좋습니다.

여기에 이미지 설명을 삽입하세요

전역 예외 처리기

@RestControllerAdvice 주석을 사용하세요.
여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

스프링 트랜잭션 관리

여기에 이미지 설명을 삽입하세요
적용 사례: 부서 삭제 시, 해당 부서 소속의 모든 직원을 동시에 삭제해야 합니다.
여기에 이미지 설명을 삽입하세요
구현 방법: 주석 사용 @Transactional
주석은 비즈니스 계층(서비스) 계층의 메소드, 클래스 및 인터페이스에 배치됩니다.
기능: 트랜잭션 관리를 위해 현재 메소드를 Spring에 넘겨주고, 메소드가 실행되기 전 트랜잭션을 시작하고, 성공적인 실행 후 트랜잭션을 제출하고, 예외가 발생하면 트랜잭션을 롤백한다.

트랜잭션 관리를 위한 로그 구성을 활성화합니다.
여기에 이미지 설명을 삽입하세요

고급사업

위의 경우 삭제 메소드에 @Transactional 주석을 직접 사용하여 트랜잭션을 시작합니다.
여기에 이미지 설명을 삽입하세요
기본적으로 런타임 예외가 발생한 경우에만 예외가 롤백되며 @Transactional에 속성을 지정하면 rollbackFor어떤 유형의 예외가 발생하는지 제어하고 트랜잭션을 롤백하는 데 사용할 수 있습니다.
여기에 이미지 설명을 삽입하세요
속성 외에도 rollbackFor@Transactional 트랜잭션 주석은 전파 동작 propagation속성을 지정할 수도 있습니다.

여기에 이미지 설명을 삽입하세요

여기에 이미지 설명을 삽입하세요
기본 트랜잭션 전파 동작은 트랜잭션이 있으면 기존 트랜잭션에 메서드를 추가하고, 트랜잭션이 없으면 새 트랜잭션을 만드는 것입니다.

뭐가 문제 야?
다음 요구 사항을 고려하십시오.
여기에 이미지 설명을 삽입하세요
작업 로그는 트랜잭션의 성공 여부에 관계없이 필요하므로 이를 달성하려면 작업 로그의 메서드를 try-catch-finally의 최종 항목에 넣어야 합니다.

하지만 실제 실행 과정에서 트랜잭션 실행이 실패하여 롤백이 발생하는 경우 finally 코드 블록의 작업 로그를 실행하는 방법도 롤백됩니다!

해결책은
작업을 로그에 삽입하는 방법에 대한 트랜잭션 주석을 작성하고 전파 모드를 propagation = 으로 지정하는 것입니다 Propgation.REQUEST_NEW.
이러한 방식으로 로그 작업 방법은 새 트랜잭션을 시작하며 실패한 트랜잭션의 롤백에 영향을 받지 않습니다.
여기에 이미지 설명을 삽입하세요

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

AOP(Aspect Oriented 프로그래밍, 관점 지향 프로그래밍)는 실제로 특정 방법을 위한 프로그래밍으로 원래 방법을 향상하거나 원래 방법을 적용할 수 있습니다.

AOP 관점 지향 프로그래밍은 동적 프록시 모드를 통해 실현됩니다.
여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

AOP 핵심 개념

  • 연결점 : JoinPoint, AOP에서 제어할 수 있는 메소드 (메소드 실행 시 관련 정보를 암시)
  • 노티피케이션(Notification) : 반복되는 로직, 즉 공통기능을 참조하는 어드바이스 (최종 메소드로 구현)
  • Pointcut: PointCut은 조인 포인트의 조건과 일치하며 포인트컷 메서드가 실행될 때만 조언이 적용됩니다. 일반적으로 컷인 방법을 일치시키기 위해 포인트컷 표현식이 사용됩니다.
  • Aspect: 알림과 진입점(알림 + 진입점) 간의 대응 관계를 설명하는 측면
  • 대상 개체: 대상, 알림이 적용되는 개체입니다.

여기에 이미지 설명을 삽입하세요

고급 AOP

알림 유형

여기에 이미지 설명을 삽입하세요

Pointcut 표현식은 주석을 통해 @Pointcut추출 할 수 있습니다. 그런 다음 필요한 경우 다시 사용하세요.
여기에 이미지 설명을 삽입하세요

통지 순서

여기에 이미지 설명을 삽입하세요

포인트컷 표현

여기에 이미지 설명을 삽입하세요

실행

반환 값, 패키지 이름, 클래스 이름, 메서드 이름, 메서드 매개 변수 및 메서드의 기타 정보에 따라 일치시키고 실행 진입
여기에 이미지 설명을 삽입하세요
점 식 와일드카드를 사용합니다.
여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

주석

주석은 특정 주석으로 식별된 메서드를 일치시키는 데 사용됩니다.
여기에 이미지 설명을 삽입하세요
주석 정의:
여기에 이미지 설명을 삽입하세요
알림을 받아야 하는 메서드에 다음 주석을 추가합니다.
여기에 이미지 설명을 삽입하세요

접합

실제 실행 방법에 대한 정보를 얻기 위해 사용됩니다.
여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

구성 우선순위

Sping 속성 구성:
여기에 이미지 설명을 삽입하세요

여기에 이미지 설명을 삽입하세요

원두관리

콩 얻기

여기에 이미지 설명을 삽입하세요
실제 단계:

  1. IOC 컨테이너 객체의 applicationContext는 주입을 통해 획득됩니다(@Autowired 주석 사용).
  2. applicationContext 객체가 제공하는 API가 Bean을 가져옵니다.
    여기에 이미지 설명을 삽입하세요

콩 범위

여기에 이미지 설명을 삽입하세요
기본 범위로 생성된 획득된 빈 객체는 싱글톤이며, @Scope 주석을 사용하여 범위를 구성할 수 있습니다.
여기에 이미지 설명을 삽입하세요

타사 콩

타사 종속 항목도 Bean을 생성할 수 있습니다. @Bean 주석을 사용해야 합니다.
여기에 이미지 설명을 삽입하세요

스프링 부트의 원리

SpringBoot는 Spring Framework를 단순화합니다. 주요 원칙은 맨 아래 계층이 시작 종속성과 자동 구성을 제공한다는 것입니다.

종속성을 시작하는 원칙은 Maven의 종속성 전송입니다.

여기에 이미지 설명을 삽입하세요

자동 구성 원리

스프링 프로젝트의 시작 클래스는 기본적으로 시작 클래스에 주석을 추가하고 @ComponentScan시작 클래스가 있는 패키지 아래에서 주석을 스캔한 Component후 주석이 포함된 클래스를 IOC 컨테이너에 추가합니다.

그런 다음 타사 라이브러리의 구성 클래스가 자동 어셈블리를 구현하려는 경우 첫 번째 솔루션은 주석 @ComponentScan구성 요소 검색을 사용하는 것입니다.
여기에 이미지 설명을 삽입하세요
하지만 이 솔루션의 단점은 주석을 선언할 때마다 @ComponentScan패키지에 속한 모든 파일을 검사해야 하므로 사용이 번거롭고 성능이 낮다는 것입니다.

옵션 2: @Import 주석을 사용합니다.

  • @Import는 일반 클래스 또는 @Configuration으로 주석이 달린 구성 클래스에서 선언될 수 있습니다. IOC 컨테이너로 직접 가져올 수 있습니다.
  • 가져오기 클래스를 생성하고 ImportSelecter 인터페이스를 구현합니다. IOC 컨테이너로 가져와야 하는 전체 클래스 이름 문자열 배열을 반환하려면 이 인터페이스에서 제공하는 메서드를 다시 작성해야 합니다.
  • 위의 방법에서는 IOC 컨테이너로 가져와야 하는 클래스를 정확히 알아야 합니다. 실제로 타사 종속성은 어떤 클래스를 IOC 컨테이너로 가져와야 하는지 가장 명확하므로 타사 종속성은 주석을 @EnableXxxx캡슐화하는 주석을 제공할 수 있습니다 @Import. 이를 사용할 때는 시작 클래스에 주석만 추가하면 됩니다 @EnableXxxx.
    여기에 이미지 설명을 삽입하세요

@SpringBootConfiguration

@SpringBootConfiguration 주석:

  • @ComponentScan 주석이 통합되었으므로 시작 클래스가 있는 패키지와 하위 패키지에 @Component 주석이 포함된 모든 클래스가 검색됩니다.
  • @Configuration 주석을 통합하면 구성 주석이기도 한 시작 클래스의 타사 종속성 선언에 대해 @Bean을 구성할 수도 있습니다.
  • 가장 중요한 점은 string 목록 형식으로 spring-boot-autoconfigure 패키지 아래 두 파일의 반환을 구현하는 EnableAutoConfiguration 주석이 포함되어 있으며 이 두 파일의 레코드를 IOC로 가져와야 한다는 점입니다. 컨테이너 클래스의 정규화된 클래스 이름입니다.
    여기에 이미지 설명을 삽입하세요

@가정 어구

특정 조건에 따라 판단하면 빈 객체는 주어진 조건이 충족된 후에만 Spring의 IOC 컨테이너에 등록됩니다.

여기에 이미지 설명을 삽입하세요

  • ConditionalOnClass: 바이트코드 파일이 환경에 존재하는지 확인한 후 IOC 컨테이너에 Bean을 추가합니다.
    여기에 이미지 설명을 삽입하세요
  • ConditionalOnMissingBean: 해당 환경에 해당 Bean이 존재하는지 확인하고, 존재하지 않으면 해당 Bean을 IOC 컨테이너에 등록합니다.일반적으로 기본 Bean 선언에 사용됩니다.
  • ConditionalOnProperty: 구성 파일에 해당 속성과 값이 있는지 여부에 따라 Bean이 IOC 컨테이너에 등록됩니다.

여기에 이미지 설명을 삽입하세요

맞춤 스타터

여기에 이미지 설명을 삽입하세요
명명 규칙:
Spring-boot-starter-function은 Spring에서 공식적으로 제공하는 시작 종속성 패키지의 이름입니다.
다른 기술에서 제공하는 시작 종속 패키지 이름은 함수 이름을 먼저 배치합니다: function-spring-boot-starter

사용자 정의 스타터는 종속성 관리 기능과 자동 구성 기능을 각각 완료하는 시작 종속성 및 자동 구성이라는 두 가지 패키지를 완료해야 합니다.
여기에 이미지 설명을 삽입하세요

사례: Alibaba Cloud OSS Launcher 사용자 정의

여기에 이미지 설명을 삽입하세요
1단계: Enabler와 Autoconfig라는 두 개의 모듈을 만듭니다.
여기에 이미지 설명을 삽입하세요
런처는 자동 구성에 따라 달라집니다.

여기에 이미지 설명을 삽입하세요
2단계: Alibaba Cloud OSS 논리 기능 구현을 완료합니다.

spring-web 및 Alibaba Cloud oss ​​종속성을 포함한 첫 번째 가져오기 종속성:
여기에 이미지 설명을 삽입하세요
사용할 때 구성 정보를 전달해야 하는 AliOSSUtils 클래스 작성을 실현합니다.
여기에 이미지 설명을 삽입하세요
구성 정보도 클래스 개체를 맞춤화해야 하며 해당 속성 값은 @ConfigurationProperties주석을 통해 구성 파일에서 "aliyun.oss"라는 접두사가 붙은 개체 속성을 참조합니다.
여기에 이미지 설명을 삽입하세요

3단계: 자동 구성 클래스를 빌드합니다.
여기에 이미지 설명을 삽입하세요

@EnableConfigurationProperties 주석을 사용하여 spring의 자동 구성 경로를 따르고, 구성 파일을 만들고, 컨테이너에 등록해야 하는 클래스 이름을 나열합니다. 4단계: 테스트 사용 테스트 모듈은 시작 모듈 종속성을 도입하기만 하면
여기에 이미지 설명을 삽입하세요
됩니다
. 지금.
여기에 이미지 설명을 삽입하세요
구성 파일에서 Alibaba Cloud oss의 구성 속성을 구성하면
여기에 이미지 설명을 삽입하세요
사용 시 직접 주입될 수 있습니다!

여기에 이미지 설명을 삽입하세요

요약하다

여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

추천

출처blog.csdn.net/baiduwaimai/article/details/131364003