자바풀스택 과정/자바 풀 스택 : 수업내용정리

자바 풀 스택 2/21 오후 기록 060-2

파티피플지선 2025. 2. 21. 17:47

<14:30 5교시>

아까 전에 했던거 간략 복습 : 메소드 실행이 안되고 끝날수도 있고 메소드를 수행하고 끝날수도 있다.

 

 

다른 방식으로 시도해보는 중

 

 

방금 만든 @Around는 util 패키지의 getMessage() 메소드의 직전이나 직후에 관여해서 작동할 수 있다.

 

 

 

 

 

 

 

 

 

이 AOP를 잘 활용하면 유틸리티로 직접 어노테이션도 만들어서 쓸 수 있는 상황인 것

귀찮은 인증이나 로딩 작업 같은 걸 AOP를 사용하면 됨.

 

스프링 부트의 3대 핵심 개념 :   

DI(Dependency Injection) : 의존성 주입

IOC(Inversion of Control) : 제어의 역전(제어권을 프레임워크에 넘겼다)

AOP(aspect oriented programming) : 관점 지향 프로그래밍 (@transactional이란 어노테이션은 commit과 rollback을 관리해주는 어노테이션이면서 AOP임)

 

나중에 서비스에 AOP 어노테이션을 적용한 기능들을 살펴 볼 거임.

 

//여기까지 Security 끝내고//

 

Spring 10 시작.

 

 

 

방금 만든거 복붙

 

 

여기에는 Security, 테이블 활용하는 user 관련 기능, post기능, 자료실, 갤러리 만들것이다.

그러면 스프링 부트의 기초는 완성.

 

추가로 할 꺼는 스프링 REST Pull? Restuful API 이란 것이 있다

지금은 컨트롤러에 html 응답을 위임하고 있다.

json만 응답하는 restful API 를 만들려고 한다.

restful API 와 관련해서는 JWT가 나온다.  JWT는 restful API를 이용해서 자격 증명을 확인할 때 어떤 상태값을 읽어들이는 기능이 좀 애매하다(?) 그때 이 JWT가 자격증명 통행권으로서 활용된다.

그러다보면 JPA(테이블 생성을 해주는 자바 클래스) Dto 유사한 Entity를 만들면 그 값을 집어넣을 테이블을 자동으로 만들어주는 그런 애인데 DB에 의존하지 않고 테이블을 알아서 만들어줌.

아무튼 얘도 나오고 쟤도 나오고 이것저것 다 엮여서 나온다.

 

그럼 얘가 리액트인가요?에 대한 선생님의 답을 최대한 정리해봤는데 맞나? -> 지피티에게 물어봐서 아래서 다시 정리해보려고 함

클라이언트가 보는 페이지에 대한 것을 어떻게 구성할거냐가 리액트의 핵심이라는 것 같은데, html에 신경쓰지 않고 json으로 응답하고 그런 상황... 그리고 이렇게 개발할 경우 프론트엔드 백엔드가 명확하게 구분하게 됨.

프론트엔드는 리액트를 이용해서 받은 데이터를 어떻게 효율적으로 예쁘게 출력할까만 고민하게 됨.

백엔드는 API만 만들면 됨.

그러면 처음 인덱스 페이지만 로딩되고 나면 페이지 전환 없이 프론트엔드에서 모두 작동(마치 앱처럼 작동하게 됨(SPA, Single Page Application)

 

우리가 지금 Spring10에서 하는 방식이면 화면 깜빡임은 있지만 페이지 전환 없이 일어날 수 있게 만들 수 있고,

API와 리액트를 적용하면 깜빡임조차 없이 앱처럼 작동하게 됨.

 

지피티에게 물어봤음


선생님이 설명한 내용을 잘 요약하셨습니다. 크게 틀린 부분은 없고, 조금 더 명확하게 설명을 덧붙여 보겠습니다.
1. Spring Boot + RESTful API + JWT
Spring Boot로 기본적인 웹 애플리케이션을 만들고, 여기에서 RESTful API를 설계할 수 있습니다.현재 컨트롤러에서 HTML 응답을 반환하고 있지만, RESTful API에서는 JSON 형태로 응답합니다.이를 위해 **JWT (JSON Web Token)**를 사용하면, 사용자 인증 및 권한 부여를 API에서 처리할 때, 상태 정보를 유지하는 대신 JWT가 인증 토큰으로서 역할을 하여, 무상태(stateless) 방식으로 자격 증명을 확인할 수 있습니다.
2. JPA와 Entity
JPA는 데이터베이스와 매핑되는 **자바 클래스(Entity)**를 통해 테이블을 자동으로 생성하고 관리합니다.**DTO (Data Transfer Object)**는 데이터 전달을 위해 사용하는 객체로, 주로 Entity와 Database와의 상호작용을 분리하기 위해 사용됩니다.JPA는 데이터베이스에 직접 의존하지 않고도, 클래스를 통해 자동으로 테이블을 생성해주는 기능을 제공하여 DB 구조를 효율적으로 관리할 수 있게 해줍니다.
3. React와 SPA
React는 클라이언트에서 데이터를 어떻게 효과적으로 처리하고, 사용자에게 보여줄지 고민하는 라이브러리입니다.HTML과는 달리, React는 서버로부터 받은 JSON 데이터를 기반으로 페이지를 동적으로 렌더링합니다.이런 방식은 프론트엔드와 백엔드가 명확하게 분리되며, 백엔드는 REST API만 제공하고, 프론트엔드는 React로 데이터를 처리하고 화면을 구성합니다.**SPA (Single Page Application)**는 처음 페이지가 로딩되면 이후에는 페이지 전체를 새로 고치지 않고도, 클라이언트에서 데이터를 받아서 화면을 갱신하며 동작합니다. 이를 통해, 화면 깜빡임 없이 앱처럼 동작할 수 있습니다.
4. Spring Boot와 React의 차이점
Spring Boot에서는 HTML 페이지가 서버에서 렌더링되어 클라이언트에게 전달되지만, React를 사용할 경우 백엔드에서 JSON만 응답하고, 프론트엔드에서만 HTML을 생성하여 화면을 처리합니다.React로 구현한 SPA에서는 페이지 전환 없이 동적으로 화면이 갱신되기 때문에 더 매끄럽고 빠른 사용자 경험을 제공합니다.
5. 정리
Spring Boot에서는 서버에서 RESTful API를 제공하고, React는 이 API를 소비하여 동적이고 빠른 UI를 제공합니다.JWT를 사용하면 API에서 무상태 인증을 구현할 수 있어, 클라이언트와 서버가 더 효율적으로 통신할 수 있습니다.
선생님의 설명을 이렇게 풀어서 보시면 이해가 좀 더 쉬울 거예요. 대체로 정확히 이해하신 것 같아요!

 

 

 

 

<15:30 6교시>

 

application.properties 설정

 

 

복붙해와서 완성된 설정 코드 아래와 같음

 

 

기본 세팅을 위한 빈 패키지 만들어주기

 

9Security에서 했던 UserDto, CustomUserDetailsService 에러나면 경로 바꿔주기,

config 패키지에 있는거 복사 붙여넣기, 컨트롤러 패키지에 있는거 복사 붙여넣기 순서대로 하면 에러 안날 것임

해서 기본 세팅 해주기

 

까먹지 말고 user 템플릿도 가져오기

 

까먹지 말고 메인메소드 있는 Application 클래스에도 크롬창 바로 열리게 해주기

 

 

이렇게 하고 run as spring boot 시작했을 때 인덱스 페이지가 나오면 성공

 

 

 

로그인된 사용자 이름을 출력하는 방법 두 가지

 

 

회원가입이 필요하다.

 

 

 

 

signupform 가지러 간 Final... 생소하기도 한데 Spring에서는  이때처럼 protected 폴더를 만들 필요도 없다

 

 

복사해오고 경로 2개 바꿔주기

주소 두개 바꾸고 회원가입 실행해보려고 하는데 안된다. 화이트리스트에 없어서.

 

 

 

securityconfig의 화이트리스트에 포함되지 않아서 문제이기 때문에 추가해준다.

 

 

그리고 컨트롤러에서도 경로 요청에 대한 내용을 리턴해주고 회원가입 페이지로 다시 들어가보면 아래 화면처럼 성공한다.

 

 

이제 데이터베이스와의 연결을 위해 dao 작업과 mapper를 만드는 작업을 한다. mapper는 new > others> mybatis 찾아서 새로운 매퍼를 만들어주고, 아까 dao라고 만들었던 패키지는 호환성을 위해서 repository로 이름을 바꿔준다.

 

<16:30 7교시>

 

 

전에 쓰던 user 테이블을 쓸거다

dto 의 필드명과 바인딩되는 #{ } 중괄호 안의 내용이 동일해야 한다.

 

차근차근 dao 만들기

 

Mapper에서 자주 쓰는 sql 문 중에 쓰기 귀찮은 칼럼이름 같은 경우 sql에 담아두고 include로 불러다 쓸 수 있다.

게다가 소문자 써도 됨

다시 얘기하지만 컨트롤러가 직접 dao를 다루는건 적절하지 않다.

service에 dao를 다룰 인터페이스와 클래스를 만든다.

 

 

 

비밀번호를 암호화 하는 로직을 만들어주는데, 우리는 이미 오전에 이해했던 SecurityConfig 클래스에 있는 @Bean 설정으로 bean으로 만들어 둔 PasswordEncoder 객체를 주입받을 수 있다.

 

user 테이블 비워두기

 

 

시간 소요되는 부분 일단 주석처리하고 임의로 잘 되게 해놓고 나중에 이 기능은 추가한다고 생각하고,

 

 

UserController에 user/sign 요청 처리하기

 

 

<17:30 8교시> 

회원가입한 아이디로 로그인 해보기 위해서, CustomUserDetailsService의 내용을 변경하고 로그인하면

 

 

지난 번 Security 연습때 집어 넣었던 임의의 데이터가 아니라 방금 회원가입한 데이터로 로그인 된다.

 

가끔 로그인이 안되는 경우가 있는데, 그럴 때 필요한 설정을 application.properties에 추가해준다.

 

그리고 세션 유지 시간이 1분이었었는데 60*20 이런 형태로 20분 동안 세션 유지가 될 수 있게 할 수 있음.

 

 

임포트 해온 내용들을 살펴서 사용하지 않는 import 내용이 있다면 지워주는게 좋다고 함.