연습 프로젝트

11.Quiz게시판.pdf
0.79MB

 

11_Quiz게시판-풀이.pdf
2.00MB

 

비밀번호는 댓글

728x90

 

 

 

 

 

웹소켓 ( Web Socket )

8_websocket 프로젝트 생성

프로젝트 버전 변경, 한글 인코딩 설정, 메이븐 프로젝트 업데이트, 이전에 만들었던 프로젝트와 /root 경로 겹치면 Servers > server.xml 에서 이전 경로 주석처리까지 진행

 

Spring WebSocket 라이브러리 버전 아무거나 추가 >> pom.xml 에 추가한 뒤 버전을 현재 사용 스프링 버전으로 변경해준다

 

데이터가 넘어올때 json 형식으로 넘어오므로 Jackson Databind 라이브러리 추가 ( 2.12.1 버전 라이브러리 추가 )

 

com.care.root 하위에 TestSocket.java 파일 생성하여 소켓에 대한 설정을 해줄 것임

 

servlet-context.xml > 하단에 Namespaces 클릭 > websocket 체크 > Source 로 이동

Namespaces 에서 websocket 활성화

 

servlet-context.xml 작성 >> /chat 경로로 요청하면 ts 를 바라보라는 의미!!!

 

TestSocket.java 클래스에서 TextWebSocketHandler 상속받기

 

Test.socket 에서 위 메소드 3가지 오버라이딩

 

afterConnectionsEstablished() : 클라이언트가 연동되면 실행

handleTextMessage() : 메세지를 받으면 실행

afterConnectionClosed() : 연결이 끊겼을 경우 실행

 

우선은 연결 시, 끊길 시, 메세지 받을 시 각 내용을 출력해볼 것임

 

HomeController.java 에 기본 경로 생성

 

test_socket.jsp 에 코드 작성 ( 상담사 연결 페이지를 출력하는 버튼 )

 

 

rec_data : 내용을 수신하기 위한 div

send_msg : 데이터를 보내기 위한 용도의 textarea

socket.jsp 작성

 

정상적으로 출력되는 것 확인

 

socket.jsp 에서 jquery 사용할 것이므로 CDN 값 추가

 

 

wsUri : 웹소켓 경로 설정 ( /chat 경로가 아까 servlet-context.xml 에서 설정한 경로 )

 

스크립트 작성

onMessage : 서버로부터 받은 값을 여기에 저장하겠다

onclose : 서버가 끊기면 작동할 로직

 

sendBtn 을 클릭하면 sendMessage() 함수를 실행하고 send_msg 의 값을 비워라 ( 텍스트 박스 안에 입력된 값을 비우기 )

 

sendMessage() 함수 정의 ( socket 으로 send_msg 의 값을 보내라 )

 

메세지가 들어올 경우 ( onMessage 함수 ) 와 연결이 끊길 경우 ( onClose 함수 ) 정의

 

접속 테스트, 메세지 전송 테스트

 

TestSocket.java 에 넘어온 메세지를 연결된 WebSocketSession 에게 전송한다 ( 지금은 자기 자신한테만 보내는 상태이며 제대로 값을 모든 세션에게 전송하려면 연결된 session 들을 배열에 담아서 반복문으로 돌려서 전송해야한다 )

 

session 을 List 로 받아 연결되면 List 에 add 로 세션 값을 저장

 

메세지가 들어오면 세션 값을 저장해놓은 List 를 반복문으로 돌려 메세지를 전송한다

 

정상적으로 모든 세션에 메세지가 전송되는 모습

 

HomeController.java 에서 test_socket 경로로 접속되면 session 값을 설정 >> 이 세션 값을 가져와서 유저를 나눌 것임 ( 추후에는 웹 사이트 아이디를 세션으로 설정하면 된다 )

 

 

일반 Session 의 값을 웹 소켓 session 에서 가로채서 사용하겠다는 의미

bean 에 추가한 경로 : org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor

 

위 작업을 진행해주지 않으면 httpsession 의 값과 websocket 의 session 의 값을 서로 다른 세션이기 때문에 httpsession 을 설정해줬다 하더라고 websocket 의 session 에서는 해당 값을 꺼내서 확인할 수 없다.

 

메세지가 들어올 시 WebSocketSession 의 Attribute 값을 map 에 담아 저장한 뒤 해당 map 에 설정해둔 name 키의 값을 사용해서 누가 보낸 메세지인지 출력 ( getPayload() 메소드는 현재 들어온 메세지를 출력 )

WebSocketSession 의 getAttributes() 메소드는 반환 값을 Map 형태로 돌려준다

>> 위 방식대로 진행하면 메세지를 출력할 때 A 가 입력한 메세지가 B와 C 에게 도착할 때 B와 C 는 자신이 보낸 메세지로 보이게 되므로 보낸 사람의 이름으로 메세지가 도착하는 로직이 추가로 들어가야 한다

 

socket.jsp 에서 엔터를 입력하면 메세지가 전송되게 설정

엔터 값 == 13

 

 

728x90

'BE > Spring' 카테고리의 다른 글

[Spring] 연습 프로젝트  (1) 2024.05.17
[Spring] URL 로 데이터 넘겨받기  (0) 2024.05.16
[Spring] Ajax, RestController  (0) 2024.05.16
[Spring] 스케쥴러 ( Scheduler )  (0) 2024.05.16
[Spring] 이메일 전송 API, 이메일 인증 구현  (0) 2024.05.16

 

 

 

 

 

 

URL 로 데이터 넘겨받기

넘겨받고자 하는 URL 데이터를 {} 로 받아서 처리하며 해당 값은 @PathVariable 어노테이션으로 받아 처리한다

@PathVariable 어노테이션 뒤에는 자료형과 URL 로 넘어온 값을 받을 변수 이름을 지정해주면 된다

 

 

728x90

'BE > Spring' 카테고리의 다른 글

[Spring] 연습 프로젝트  (1) 2024.05.17
[Spring] 웹소켓 ( Web Socket )  (1) 2024.05.17
[Spring] Ajax, RestController  (0) 2024.05.16
[Spring] 스케쥴러 ( Scheduler )  (0) 2024.05.16
[Spring] 이메일 전송 API, 이메일 인증 구현  (0) 2024.05.16

 

 

 

 

 

Ajax, RestController

프로젝트 생성 및 버전 변경, 한글 인코딩 설정 후 메이븐 프로젝트 업데이트까지 실행할 것

 

경로설정

 

jsp 파일 생성하여 작성

 

ajax 를 사용하지 않으면 전체 페이지가 다시 요청되어 로딩된다...!!

ajax 를 사용하면 페이지 전체를 요청하는게 아닌 데이터만 요청한다

 

ajax 사용할 경로 추가

 

ajax01.jsp 파일 생성해서 코드 작성 후 테스트

 

>> 페이지가 완전 로딩되지 않고 요청에 return 되는 값만 출력된다!!!

 

경로 추가 ( @ResponseBody 태그를 사용해 return 값이 jsp 파일이 아닌 데이터 형식으로 반환하는 메소드임을 선언!! )

 

ajax 를 사용하여 data 매개변수로 응답 데이터를 저장한뒤 span 태그의 내부 html 을 데이터 값으로 변경

 

 

 

 

 

데이터를 json 형식으로 보내주기 위해 라이브러리 추가

2.9.5 버전 라이브러리 추가

 

라이브러리 추가

 

DTO 클래스 생성 >> 변수 선언 및 getter / setter 생성

 

Controller 에서 데이터 받아 처리하는 코드 작성

 

ajax03.jsp 작성 ( 데이터 json 형태로 넘겼다가 받아와서 값 처리 )

 

넘어오는 값을 DTO 가 아닌 Map 으로 담아서 처리할 수도 있음

Map 으로 담아서 처리

 

결과 확인

 

 

 

 

 


 

 

 

 

 

RestController 사용

@Controller : 페이지를 return 하는 컨트롤러

@RestController : 데이터를 return 하는 컨트롤러

 

Controller 작성

 

ajax04.jsp 작성

 

jquery 를 사용하여 ajax 를 사용

 

ajax04.jsp 를 출력하기 위해 HomeController 에 경로 설정

 

※ 전달받는 값이 json 형식이 아니라 text 형식이라 오류가 발생했음!!! ※

※ text 형식을 반환할거면 produces 값에 application/text 로 변환해주면 되는데 일단은 Map 에 키와 값으로 담아서 전송 ※

 

json 형태로 전송

 

응답으로 넘어온 데이터의 result 키를 확인

 

코드 실행
728x90

 

 

 

 

 

Scheduler

Scheduler 설정하는 방법

 

위와 같이 설정하면 Scheduler 설정은 끝 ( 10 초마다 한번씩 반복 )

 

시간 설정은 cron 의 값으로 설정 >> google 에 Scheduler cron 검색하면 시간 설정 값 확인할 수 있음

728x90

 

 

 

 

 

이메일 전송 API, 이메일 인증 구현

 

Spring Context Support 라이브러리 버전 아무거나 선택해서 추가 >> 현재 사용중인 스프링 버전으로 변경

 

라이브러리 추가할 것임 ( JavaMail API JAR, JavaMail API )

 

1.5.4 버전 라이브러리 추가

 

1.5.3 버전 라이브러리 추가

 

google 계정으로 발송해볼 것임 >> google 로그인 후 Google 계정 관리 클릭

 

파일 세팅

 

Mailconfig 파일 작성 ( 비밀번호 칸에는 앱 비밀번호가 들어가야 한다 )

 

- 앱 비밀번호 설정하기 -

앱 비밀번호 설정하기 >> 앱 이름 설정 후 만들기 클릭 >> 생성된 앱 비밀번호를 setPassword 부분에 넣어준다

 

sendmail 경로로 접속 시 메일을 보냈습니다. 출력되게 설정

 

Service 쪽으로 받을 메일 주소, 제목, 내용을 전달

 

MailServiceImpl 작성 후 테스트

 

sendmail 경로로 접속하면 정상적으로 메일이 발송된다

 

메일 전송된 것 확인

 

 

 

 

 

이제 메일의 내용을 html 형식으로 보내볼 것임

Controller 에 HTML 형식으로 메일 보내는 것 추가

 

Service 에서 text 형식이 아니라고 명시한 뒤 메일 다시 전송해봄 ( 이미지는 구글에 검색해서 나온 이미지주소를 아무거나 사용했음 )

 

html 형식으로 메일 정상적으로 전달되는 모습!!!

 

 

 

 

 

이메일 인증을 만들어볼 것임

Controller 에 경로 추가

 

auth.jsp 작성

 

Controller 에 경로 추가

 

Service 에 랜덤 수 생성 코드 추가, session 을 발급

 

Controller 에 이메일 인증 내용을 작성하여 아까 만들어둔 sendMail02 메소드를 사용하여 이메일 전송 ( a 태그 안에 랜덤으로 생성한 키를 userId 값으로 넘겨준다 )

 

이메일 전송 후 확인 ( 이동 경로도 정상적으로 들어오는지 확인 )

 

세션의 값과 파라미터로 넘어온 값이 같은지 확인하는 코드 작성 후 확인

 

확인

 

 

728x90

 

 

 

 

 

영속성 컨텍스트

영속성 컨텍스트란 엔티티를 영구 저장하는 환경으로써, 애플리케이션과 데이터베이스 사이에서 엔티티를 관리하는 논리적인 영역이다.

이를 통해 1차 캐시, 동일성 보장, 트랙잭션 지원, 쓰기 지연, 변경 감지, 지연 로딩 등 다양한 기능을 제공하며 영속성 컨텍스트는 한 트랜잭션 단위 ( 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위 - 논리적 단위 ) 에서만 존재했다가 한 트랜잭션이 종료되면 영속성 컨텍스트도 삭제된다.

 


 

비영속

Member member = new Member();

객체만 생성한 상태로써 아직 영속성 컨텍스트에 저장하지 않은 상태 - 비영속 ( new / trasient )

 

 

 

 

 

영속

em.persist(member);

엔티티 매니저의 persist() 메소드를 사용해 member 객체를 영속성 컨텍스트에 저장한 상태 ( 영속성 컨텍스트에 의해 member 객체가 관리되는 상태 )

 

 

 

 

 

준영속

// 특정 엔티티만 준영속 상태로 전환한다.
em.detach(member);
// 영속성 컨텍스트를 완전히 초기화한다.
em.clear();
// 영속성 컨텍스트를 종료한다.
em.close();

JPA 에서 준영속 상태란 이전에 영속 상태에 있던 엔티티 객체가 영속성 컨텍스트에서 분리되어 더 이상 관리되지 않는 상태를 나타낸다.

준영속 상태의 엔티티는 JPA 가 더 이상 추적하거나 관리하지 않는다.

 

 

 

 

 

삭제

em.remove(member);

엔티티 인스턴스를 영속성 컨텍스트에서 제거하며 데이터베이스에서 삭제한다.

 


 

 

 

 

 

1차 캐시

  • 영속성 컨텍스트 내부에 캐시를 가지고 있다.
  • 엔티티를 영구 저장하는 환경으로 트랜잭션 단위의 메모리 공간이다.
  • 조회 시, 1차 캐시를 통해 엔티티를 빠르게 찾을 수 있다.
  • 데이터베이스에 접근하지 않고도 엔티티의 동일성을 보장한다.

 

동일성 보장

  • 1차 캐시를 통해 같은 엔티티를 조회하면 동일한 참조값을 반환한다.
  • Java 컬렉션처럼 동일한 주소의 값을 가져오는 것과 유사하다.

 

쓰기 지연

  • 엔티티 매니저의 persist 호출 시 데이터베이스에 저장되지 않고 1차 캐시에 저장된다.
  • 트랜잭션 커밋 시점에 쿼리가 발생하여 최적화가 가능하다.

 

변경 감지

  • 엔티티의 변경 사항을 감지하여 자동으로 UPDATE 쿼리를 생성한다.
  • 1차 캐시의 스냅샷과 비교하여 변경 여부를 확인한다.
728x90

'BE > JPA' 카테고리의 다른 글

[JPA] 매핑 어노테이션 종류  (0) 2024.05.20
[JPA] 프로젝트 세팅, JPA insert, JPA select, JPA update  (0) 2024.05.11
[JPA] H2 Databas 설치, IntelliJ 설치  (1) 2024.05.09
[JPA] JPA 란?  (1) 2024.05.09

 

 

 

 

 

파일 업로드, 다운로드

파일 세팅 ( FileService 인터페이스는 따로 사용하지 않으므로 생략 )

 

파일 세팅

 

pom.xml 파일에 프로젝트의 버전 변경 >> maven 프로젝트 업데이트 >> 한글 인코딩 작업 실행

 

이제 파일 업로드, 다운로드에 필요한 라이브러리를 추가할 것임

 

commons fileupload 라이브러리 추가할 것 >> 1.3.3 버전 >> pom.xml 에 추가

 

입, 출력을 담당하는 라이브러리 >> 2.4 버전 >> pom.xml 에 추가

 

class 파일로 bean 객체를 추가

 

기존에 servlet-context.xml 에서 빈 객체를 등록하던 방식을 클래스 파일에서 어노테이션을 사용해서 등록하여 사용

( 위 xml 파일은 어노테이션을 활용해서 작성하는 방법을 설명하기 위해 작성했으므로 xml 파일 내 빈 객체 등록 부분은 주석처리 하였음 )

 

파일 업로드 경로 작성 >> uploadForm.jsp 에 업로드 폼 작성 >> 파일 전송 시 이동될 경로 작성

 

Controller 에도 파일 받아서 처리할 url 경로 작성 및 넘어온 파일을 변수로 담아서 출력해봤음 >> service 쪽으로 받은 파일을 넘겨줌

 

파일 저장 로직 완성 ( 파일 명 앞에 저장 시간을 년월일시분초 형식으로 붙인 뒤 변수로 저장 경로를 지정하여 저장 )

 

 

 

 

 

DB 에 저장한 이미지의 이름을 저장해볼 것임

create table file_image(
    id varchar(20) primary key,
    name varchar(20),
    img_name varchar(100) 
);

sql 문 작성 및 실행

 

▼ DB 연동 작업 ▼

DB 연동에 필요한 라이브러리 추가

 

root-context.xml 작성

 

fileMapper.xml 세팅

 

▲ DB 연동 세팅 완료 ▲

 

DB 와 연동할 객체 DTO 작성

 

파일을 저장하지 않으면 DB 에 nan 으로 처리, 파일을 저장한다면 파일 명을 DB 에 저장

 

FileMapper 인터페이스에 메소드 추가

 

FileMapper.xml 파일에 sql 문 작성

 

FileMapper.xml 파일에 namespace 를 설정해주지 않아서 다시 고침

 

이미지 파일 전송해보니 정상적으로 파일 이름 DB 에 저장되는 모습

 

파일 저장도 되는 모습

 

( 현재 테이블에 id 값을 primary key 로 지정해놓아서 동일한 아이디로 파일 업로드를 하면 무결성 조건 에러가 발생되는데 이때, 정상적으로 파일은 디렉토리에 저장되지만 DB 에 파일명을 저장할때 무결성 조건 에러를 만나면서 DB 에 파일명이 저장되지는 않는다,,,, )

 

 

 

 

 

파일을 jsp 파일에 출력해볼 것임

경로 생성

 

Controller 에서 model 객체를 Service 에 전달, Service 에서는 Mapper 를 사용해 데이터를 가져와서 model 에 저장할 것임

 

 

FileMapper.xml 에 select 문 작성 ( resultMap 을 사용해서 컬럼명과 변수를 Mapping )

 

전달받은 데이터를 forEach 문으로 화면에 출력

 

다운로드와 이미지 출력 구현

 

download 경로를 컨트롤러에 작성 및 download 기능을 구현

 

 

 

 

 

파일 삭제 기능 추가

result.jsp 에 파일 별로 a 삭제할 경로와 파일 출력할 img 태그 추가

 

delete 경로로 들어왔을때 file 명과 id 값을 받아서 service 로 전달

 

service 에서는 mapper 로 id 값을 전달하여 db 에 저장된 파일정보를 삭제, 디렉토리 내의 파일은 service 에서 삭제

 

 

FileMapper.xml 에 sql 문 작성

 

코드 실행 영상

 

728x90

+ Recent posts