매핑 어노테이션 종류

어노테이션 설 명
@Column 컬럼 매핑
@Temporal 날짜 타입 매핑
ex) @Temporal(TemporalType.TIMESTAMP)


@Enumerated enum 타입 매핑
ex) @Enumerate(EnumType.STRING)
@LOB BLOB, CLOB 매핑 ( 대형 오브젝트를 의미 )
( String 자료형을 @Lob 어노테이션을 사용해 매핑하면 DB 에는 자동으로 CLOB 으로 매핑된다 )
@Transient 특정 필드를 컬럼과 매핑하고싶지 않은 경우 사용
( 데이터베이스에 저장 X, 조회 X )
주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용

 

 

 

 

 

@Column 속성

속성 설명 기본 값
name 필드와 매핑할 테이블 컬럼 이름

ex) @Column(name = "user_id")
객체의 필드 이름
insertable
updateable
등록, 변경 가능 여부

ex) @Column(updatable = false)
TRUE
nullable (DDL) null 값의 허용 여부를 설정
false 로 설정하면 DDL 생성 시에 not null 제약 조건이 붙는다

ex) @Column(nullable = false)
 
unique (DDL) @Table 의 uniqueConstraints 와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용

ex) @Column(unique = true)
( 유니크 제약조건의 이름이 랜덤으로 생성되므로 잘 사용하지 않는다 )
 
columnDefinition (DDL) 데이터베이스 컬럼 정보를 직접 줄 수 있다

ex) @Column(columnDefinition = "varchar(100) default 'EMPTY'")
=> varchar(100) 으로 컬럼 생성, 기본 값은 'EMPTY' 로 지정된다
필드의 자바 타입과 방언 정보를 사용
length (DDL) 문자 길이 제약조건, String 타입에만 사용한다

ex) @Column(length = 10)
=> varchar(10) 으로 컬럼이 생성된다
255
precision,
scale (DDL)
BigDecimal 타입에서 사용한다 ( BigInteger 도 사용 가능 )  

 

 

 

 

 

@Enumerated 속성

※ 주의 ! ORDINAL 은 사용 X ( 기본 값이기 때문에 변경해서 사용!!! ) ※

속성 설명 기본 값
value • EnumType.ORDINAL : enum 순서를 데이터베이스에 저장

• EnumType.STRING : enum 이름을 데이터베이스에 저장

ex) @Enumerated(EnumType.STRING)
EnumType.ORDINAL

 

 

 

 

 

@Temporal 속성

JAVA 에서 자료형을 LocalDate, LocalDateTime 을 사용하는 경우는 자동으로 매핑해준다

즉, 속성 생략이 가능 ( 최신 하이버네이트 지원 )

LocalDate : DB 의 DATE 와 매핑

LocalDateTime : DB 의 TIMESTAP 와 매핑

속성 설명 기본 값
value TemporalType.DATE : 날짜, 데이터베이스의 date 타입과 매핑
( 예 : 2024-05-20 )

TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑
( 예 : 10:57:23 )

TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑
( 예 : 2024-05-20 10:57:23 )
 

 

 

728x90

 

 

 

 

 

연습 프로젝트

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 란?  (0) 2024.05.09

+ Recent posts