JPA 를 학습하느라 IntelliJ 를 설치 후 java22 버전을 설치했는데 원래 설치되어 있던 java 11 버전과 충돌이 발생함

 

이 경우 sts 설치 폴더 > STS.ini 파일에 사용할 java 의 버전을 명시해주면 된다

 

기존 sts.ini 파일 >> 변경 sts.ini 파일

 

위와 같이 설정하면 STS 를 실행하면 Virtual Machine 을 java jdk 11 버전으로 실행하게 된다

 

 

▼ 참고 ▼

 

eclipse, intellij jdk버전 설정

intellij를 사용하기 위해, 17버전의 자바를 설치해야한다근데 eclipse와 intellij를 둘다 사용하기 위해서는 eclipse(legacy spring)는 11버전을 요구하고, intellij는 17버전을 요구하기 때문에 각각 다르게 버

xodud5080.tistory.com

 

728x90

 

 

 

 

 

JPA 란?

- Java Persistence API (JPA)는 자바 어플리케이션과 데이터베이스 간의 객체-관계 매핑을 위한 표준 인터페이스입니다. JPA는 객체 지향 프로그래밍 모델을 사용하여 데이터베이스를 다룰 수 있게 해주며, Hibernate와 같은 구현체를 통해 실제로 데이터베이스와 상호 작용합니다. JPA를 사용하면 개발자는 복잡한 SQL 쿼리를 작성하는 대신 자바 객체를 조작하여 데이터베이스 작업을 수행할 수 있습니다.

 

 

 

 

 

JPA 의 장점

1. 객체 지향적인 접근 방식 : JPA 는 데이터베이스와 객체 간의 매핑을 지원

2. 생산성 향상 : JPA 는 반복적이고 지루한 SQL 쿼리 작성을 줄여줌

3. 표준 인터페이스 : JPA는 Java Persistence API로 표준화되어 있어 다양한 JPA 구현체(예: Hibernate, EclipseLink)를 선택할 수 있음

 

JPA 의 단점

1. 성능 문제 : 잘못된 쿼리 작성이나 부적절한 설정으로 인해 성능 문제가 발생할 수 있음 ( 이를 최적화하기 위해 추가적인 노력이 필요 )

2. 복잡성 : JPA 는 풍부한 기능을 제공하지만 종종 단순한 데이터베이스 작업에는 ORM보다 간단한 방법이 더 적합할 수 있음

 

728x90

 

 

 

 

 

DB 연동

 

파일 세팅

!!! MemberDAO 파일 Interface 파일로 만들어야 함 주의 !!!

pom.xml 버전 세팅

 

프로젝트 우측 클릭 > maven > update project 클릭

 

web.xml 인코딩 추가

 

파일 세팅 완료

 

일반 xml 파일 세팅

 

일반 class 파일 세팅

 

Spring Bean Configuration File 생성 ( xml 파일 )

 

 

 

 

 

스프링에서는 JUnit 을 사용하여 테스트를 진행

 

JUnit 기능

 

 

 

 

 

JUnit 패키지 다운로드 및 적용

메이븐 레파지토리 검색하여 페이지 접속 후 spring-test 검색 >> 아무 버전이나 클릭 ( 버전은 아래서 바꿔줄 것이기 때문 ) >> 코드 복사

 

pom.xml 에 dependencies 태그 안에 붙여넣기 >> pom.xml 상단의 버전 copy >> 붙여넣은 코드에 version 복사한 것으로 바꾸기

 

프로젝트 우클릭 >> properties >> Java Build Path >> Libraries >> Add Library >> JUnit 선택 >> Next >> JUnit 4 선택 >> Finish >> Apply and Close

 

설치 완료


 

 

 

 

 

JUnit 을 사용하여 Test

 

컨트롤러 빈에 등록 ( 테스트 해볼 것임 ) >> testMember.xml 파일에 com.care.root 부터 모든 빈 객체를 테스트할때 사용하겠다라고 설정

 

- testMember.xml 파일에 설정하는 부분 -

웹 구동 파일이 많아 서버를 재시작하며 테스트 하기에 시간이 오래걸리는 경우 서버는 켜둔 상태로 빈 객체만 가져와서 객체가 정상적으로 작동하는지 테스트하기 위해 해당 xml 파일에 사용할 빈 객체의 범위를 설정하여 사용한다

 

TestMember.java 에 테스트 코드 작성 후 메소드에 마우스 올려둔 뒤 Ctrl + F11 눌러 JUnit 선택 후 확인 >> 빈 객체가 정상적으로 생성된 것 확인

 

MemberServiceImpl.java 에 MemberService 를 상속받은 뒤 @Service 어노테이션을 사용하여 빈 객체로 등록 >> Test 코드를 작성하여 assertNotNull 를 사용해서 해당 빈 객체가 null 값이 아니라 정상적으로 생성 되었는지 확인 ( 메소드에 커서 놓고 Ctrl + F11 ) >> 빈 객체가 null 이 아니라 정상주입 되었다면 결과가 초록색 바로 출력된다

 

create table test_mybatis(
    id number(4),
    name varchar2(20)
);

Oracle DB 에 테이블 추가

 

테이블 추가 완료

 

1. 마이바티스 프레임워크를 사용할 것임

2. 히카리 cp 를 사용해서 connection pool 기능을 사용할 것임

connection pool - 미리 DB 에 연결해 놓은 객체를 생성한뒤 연결 객체를 호출되는 곳에 빌려준다.

 

라이브러리 추가

HikariCP 라이브러리 검색 ( 3.3.1 버전 사용할 것임 ) >> 코드 복사 >> pom.xml 에 추가

 

Spring JDBC 검색 >> 아무 버전이나 가져온 뒤 pom.xml 에 붙여넣기 >> 버전 교체

 

MyBatis 라이브러리 설치 ( 버전 확인 후 설치 )

 

Spring 용 마이 MyBatis 도 라이브러리 설치 ( 버전 확인 후 설치 )

 

내 피씨의 오라클DB 버전 확인

 

오라클 DB 버전 11 버전 : ojdbc6

오라클 DB 버전 19 버전 이상 : ojdbc8

 

내 오라클 DB 버전과 동일한 버전의 라이브러리 선택 후 설치

 

pom.xml 저장하면 Maven Dependencies 에 추가한 내용들이 저장된 것 확인할 수 있음

 

라이브러리 설치 끝

 


 

 

 

 

 

DB 연결 설정

 

HikariCP 설정

HikariConfig.class 열기 >> 패키지이름과 class 이름 복사

 

root-context.xml 에 아까 복사한 [패키지이름].[클래스명] 을 class 에 입력 후 property 추가하여 해당 클래스의 변수인 username, password, jdbcUrl, driverClassName 의 값을 자신의 오라클 DB 설정 값으로 넣어준다

 

위에서 설정한 hikariConfig 빈을 매개변수로 생성자에 넣어서 HikariDataSource 클래스 빈을 ds 라는 이름으로 생성

 

 

 

 

 

마이바티스 설정

SqlSessionFactoryBean.class 열어서 패키지이름, 클래스 이름 저장

 

root-context.xml 에 마이바티스 관련된 빈 객체 저장 ( property 를 사용하여 dataSourse 변수에 위에서 설정한 ds 빈을 넣고 mapperLocations 변수에 src/main/resources/mapper/ 폴더 하위의 모든 폴더 내에 있는 Mapper.xml 로 끝나는 파일들을 설정해준다

 

memberMapper.xml 파일에 생성한 MemberDAO 인터페이스 파일을 등록

 

root-context.xml 작성

 

 

 

세팅 완료....


 

 

 

 

DB 연결 테스트

 

DAO 빈 객체가 정상적으로 연결되는지 확인 ( 메소드에 커서 후 Ctrl + F11 ) >> 정상 연결

 

DTO, DAO 작성

 

memberMapper.xml 에 insert 작성

 

DAO 테스트 코드 작성 >> 메소드에 커서 두고 Ctrl + F11 >> 초록색 바 ( 성공 )

 

추가한 내용 잘 적용되는지 sql developer 에서도 확인

 

위에서는 DAO 만 실행해서 코드를 진행시켰는데 이번엔 Service 에서 DTO 객체를 DAO 로 넘겨서 실행시킬때도 문제가 없는지 확인해볼 것임

 

Service 에 dao 에 dto 객체 전달하는 코드 작성

 

테스트 코드 실행 >> 성공 >> sql developer 에서도 확인

 

데이터 삭제하는 코드 테스트 할 것임 >> DAO 작성 >> memberMapper.xml 에 deleteUser 메소드에 대한 쿼리문 작성

 

테스트 메소드에 커서 둔 뒤 Ctrl + F11 하여 테스트 >> 성공 >> result 로 1 반환 ( 성공 )

 

 

 

 

 

Controller 로 요청을 받아 실행이 되는지 테스트

Controller ( Mock ) > Service > DAO 순으로 전체적인 테스트를 진행

Controller 작성 >> TestMock 클래스 파일 생성하여 Controller 의 접속 경로와 데이터 까지 받아서 테스트 진행 ( MockMvc 는 수동으로 import 해줘야 하므로 아래의 코드 넣어줘야 함 ) >> 메소드 클릭 후 실행

 

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;

Mock import 코드

 

코드 실행 시 200 으로 나오면 성공적으로 연결되었다는 의미, 초록색 바 ( 성공 ) >> sql developer 에서도 확인

 

테스트 코드이기 때문에 코드 실행 후 롤백 시키는 기능 추가 >> 테스트 코드를 아무리 실행시켜도 이젠 데이터가 저장되지 않음 ( 저장 이후 롤백되게 때문, 즉 실행이 정상적으로 되는지 확인만 하고 실제 데이터는 저장되지 않음 )

 

 

 

 

 

위에서 테스트가 정상적으로 실행되는 것이 확인되었기 때문에 실제로 구현

실제 웹 작성하여 구동

 

정상 구동 확인

 

728x90

 

 

 

 

 

쿠키 / 세션

 

프로젝트 신규 생성 ( Spring Legacy Project )

 

버전 설정

 

프로젝트 우 클릭 후 메이븐 > 업데이트 프로젝트 클릭

 

인코딩 방식 설정 web.xml 에 코드 추가

 


기존 url > /ex01 경로와 충돌 해결

서버 실행 시 기존에 사용하던 ex01 경로와 충돌 때문에 에러 발생 >> 기존 사용 ex01 경로 주석 처리 >> 서버 재실행 >> 서버 구동 완료

 


 

쿠키 발급, 조회, 삭제

 

CookieController 클래스 파일 생성 >> cookie 경로로 이동되면 출력될 jsp 파일 생성 >> 접속 후 쿠키 존재 여부 확인

기본 발급 쿠키를 제외하곤 쿠키가 존재하지 않음

 

쿠키를 생성하여 발급 >> 확인 ( 5초 뒤 쿠키가 삭제되는 것 확인 )

 

req 를 통해 쿠키 값을 확인

 

특정 쿠키의 값만 확인할때

@CookieValue 어노테이션 사용

@CookieValue 어노테이션을 사용해서 확인 >> required = false 를 사용하여 쿠키 값이 존재하지 않는다면 null 로 처리하겠다고 선언 >> cook 을 출력하면 객체 값 출력, getName(), getValue() 메소드 사용하여 이름과 값을 가져와서 사용

 

쿠키 값 확인을 위해 경로 추가 >> cookie02.jsp 추가 ( 팝업 띄울 것임 )

 

팝업창 경로 추가 >> 팝업 내용 작성

 

하루동안 열지 않음 클릭 시 cookieChk 경로로 이동 >> Controller 에 하루동안 열지 않음 클릭 시 쿠키를 발급할 경로를 추가 및 쿠키 발급

 

 

 

 

 

쿠키가 존재하지 않으면 팝업창을 띄우게 설정 1

( 백엔드, 프론트엔드가 나눠져 있는 경우 사용 불가, 사용하는 문법이 jsp 문법이므로 )

쿠키 값이 존재하지 않으면 팝업창 출력되게 설정

 

 

 

 

 

쿠키가 존재하지 않으면 팝업창을 띄우게 설정 2

( 자바스크립트 문법을 사용 )

쿠키 값이 존재하지 않으면 팝업창 출력되지 않게 설정

 

 

 

 

 


 

 

 

 

 

세션 발급, 조회, 삭제

 

파일 세팅

 

makeSession 경로로 들어오면 세션을 발급 >> makeSession.jsp 에서 세션 값 확인 >> 웹에서 확인

 

resultSession 경로 Controller 에 추가 >> resultSession.jsp 파일 작성

 

만약 Attribute 로 세션과 동일한 이름의 값이 존재한다면 단순 출력 시 생존 범위가 좁은 Attribute ( request 와 생존 범위가 동일 > 현재 페이지에서만 생존 ) 가 출력되므로 sessionScope.[세션이름] 으로 세션을 확인 및 사용한다

 

delSession.jsp 작성 >> Controller 에서 세션을 삭제하는 방법 두가지 사용 ( HttpServletRequest, HttpSession 두 가지 사용 )

 

세션 발급, 조회, 삭제 완료

 


 

 

 

 

 

로그인 구현

 

jsp 파일 세 개 ( login, logout, main ) 세팅

 

login 경로 추가 >> login.jsp 작성 >> 확인

 

아이디 비밀번호 입력 후 로그인 시 이동될 check 경로 Controller 에 설정 >> main.jsp 작성 >> 확인

 

로그아웃 시 세션 삭제 Controller 에 구현 >> logout.jsp 작성 >> 확인

 

로그인 사용자는 로그인 페이지 접속 시 세션정보 출력 및 로그아웃 할 수 있게 세팅

 

로그인 하지 않고 logout 으로 접속 시도 할 시 session 으로 로그인 상태 확인하여 login 페이지로 redirect

728x90

 

 

 

 

 

정적 파일 관리

 

정적 파일을 관리하는 resources 폴더

javascript, css 등을 관리

 

정적 파일을 관리할 폴더 생성

 

css 파일 생성 후 작성

 

javascript 파일 생성 후 작성, img 폴더에 이미지도 추가

 

servlet-context.xml 에 있는 resources 관리 부분 ( location 이 리소스의 위치 지정 부분 )

 

jsp 파일에서 jstl 문법을 사용하여 url 을 path 변수로 설정하고 확인해본다

 

link 태그를 사용하여 css 도 적용

 

css, js 파일 경로 설정 및 별칭

/resources/css/ 경로의 파일을 /css/** 로 사용하겠다,  /resources/js/ 경로의 파일을 /js/** 로 사용하겠다

 

css 파일 생성 및 별칭 jsp 파일에 적용 ( 절대경로로 표현해봄 )

 

js 파일을 jsp 파일에서 불러와 js 파일 내에 선언해 놓은 test() 함수를 호출하여 버튼 클릭 시 사용 ( alert 함수 선언해 놓았음 )

 

js 파일 적용 영상
728x90

 

 

 

 

 

리다이렉트 / 포워드

파일 세팅

 

간단하게 로그인 폼 작성

 

redirect 와 forward 차이

 

redirect : 사용자가 주소를 전달받아 서버에 다시 요청한다 ( 즉, get 방식으로 요청된다, 파라미터 값이 전달되지 않음 )

forward : 사용자가 요청하는 것이 아니라 서버에서 돌려주는 것이라 요청방식이 유지되며 파라미터 값, Attribute 값이 그대로 전달된다 >> forward 를 사용하는 경우 웹 출력 화면이 변해도 ( 실제 출력되는 jsp 파일이 변해도 ) url 은 첫 요청 페이지에서 변하지 않는다.

 

로그인 정보 일치 시 forward 를 사용하여 파라미터 값과 Attribute 값을 success.jsp 에 전달하여 사용

 

코드 실행 영상

 

 

- 차이점 리뷰 -

로그인 성공 시 forward 로 success.jsp 로 넘기며( 서버에서 처리 ), 로그인 실패 시 redirect 로 다시 login 페이지로 이동 >>

1. 콘솔창에 뜨는 method 와 파라미터, Attribute 값이 redirect 에서는 소멸, forward 에서는 그대로 남아 이동되는 것 확인

2. forward 로 이동 시 url 이 처음 접근한 url 이고 ( 서버에서만 처리하여 보여주는 것이기 때문 > 그렇다고 서버에서 Controller 를 거쳐 출력되는 것이 아니라 그냥 jsp 파일만 출력할 뿐 > 고로, 연산은 따로 진행되지 않음 ) redirect 로 이동 시 url 이 처음 접근한 url 이 아니라 변경 요청된 url 임을 확인 ( 서버가 주소를 클라이언트에게 전달하여 클라이언트가 다시 서버로 요청 )

728x90

 

 

 

 

 

어노테이션

어노테이션

: 어노테이션을 붙이면 프로젝트 실행 시 빈 객체로 등록된다 ( = 생성자가 실행된다 )

 

파일 세팅

 

어제 세팅해둔 com.care.ex01 을 com.care.ex02 로 변경

 

Controller, DAO, Service 에 각각 기본 생성자 생성 후 콘솔에 출력되게끔 하고 Controller 에만 어노테이션을 적용하여 실행

어노테이션이 붙으면 서버 실행 시 빈으로 등록되어 생성자가 실행된다 >> Controller 의 생성자만 실행되는 모습

 

DAO 와 Service 에 @Component 어노테이션을 붙여서 실행 >> 콘솔 창 출력

 

이번에는 DAO 에는 @Repository, Service 에는 @Service 어노테이션을 붙인 뒤 실행 >> 콘솔 창 확인

 

어노테이션은 종류에 따라 기능적 차이는 없고 빈 객체로 등록만 시킬 뿐이다...

예를 들어 Service 클래스에 @Controller 어노테이션을 붙여도 문제가 생기지 않는다

( 즉, 이름만 구분지어 놨을 뿐 기능 상 차이는 없다 )

 

 

 

 

 


 

 

 

 

 

만들어진 빈 객체를 꺼내오는 방법

만들어진 빈 객체를 꺼내오는 방법

 

Controller 에 코드 작성 후 서버 실행 ( MemberService 변수 생성, RequestMapping 을 사용하여 ex02/index 경로로 오는 내용을 처리 )

 

@Autowired 어노테이션을 사용하여 서버를 재시작 후 페이지에 접속하니 이미 등록된 service 객체를 불러오니 객체 값이 출력된다

 

Controller 에서 Service 쪽에 getData 메소드에 model 전달

 

Service 에 getData 메소드 생성 후 저장 > 웹 재접속 시 콘솔창에 출력되는 내용 확인

 

Service 에서 DAO 로 접근해야 하므로 Autowired 이용하여 DAO 객체를 불러와서 사용 >> DAO 의 메소드를 사용할 코드 작성

 

DAO 에서 값을 리턴 >> Service 에서는 해당 내용을 msg 변수로 받아 model 에 msg 라는 키로 저장

 

jsp 에서 전달받은 model 의 저장값 출력되는 것 확인

 

root-context.xml 파일에서 MemberService 를 abc 라는 빈 객체를 생성 >> MemberSerivce 에서 어노테이션에 빈 객체의 이름을 명시하여 저장

>>> 에러가 발생, Autowired 는 자료형을 기준으로 먼저 찾고 자료형이 같은 객체가 2개가 존재하면 이름으로 찾는데 현재 빈 객체에 MemberService 자료형이 두개 존재하므로 이름으로 찾기를 시도하지만 Controller 에서 설정한 변수 이름인 ms 와 동일한 이름을 가진 빈 객체를 찾지 못해 주입하지 못하고 오류가 발생된다.

 

빈 객체의 이름과 Autowired 로 호출하는 변수의 이름을 일치시키면 정상적으로 작동한다.

 

root-context.xml 에 DAO 빈 객체 등록 ( 아까 어노테이션으로 DAO 객체를 설정해놨으므로 Service 쪽 DAO 변수에 설정한 Autowired 에서 문제 발생 ) >> Service 에서 @Inject, @Qualifier 어노테이션을 사용해서 빈 객체의 이름을 지정하여 주입해서 사용할 수 있다.

 


 

 

 

 

GET, POST 전송 방식 처리하기

index.jsp 에 get 방식 전송과 post 방식 전송 코드 작성

 

웹에서 전송을 클릭하면 Controller 로 넘어올테니 Controller 에 코드 작성 및 result 페이지 작성

 

@RequestMapping 을 사용하면 get 방식과 post 방식을 모두 받을 수 있음

 

Controller 에서 RequestMapping 어노테이션에 GET 방식만 받게끔 설정 후 POST 방식으로 전송하여 확인 >> 405 에러 출력 ( GET 방식만 받도록 설정했기 때문 )

 

Controller 에서 전달받은 파라미터 값을 model 에 담아서 jsp 로 전달 >> jsp 파일에서 출력

 

입력 전송 > 확인 ( 파라미터 값이 model 객체를 사용하여 잘 넘어가는 것 확인 )

 

이번에는 POST 방식을 처리해볼 것임

 

PostMapping 으로 동일한 경로로 post 로 넘어오는 값을 처리 ( 어노테이션을 사용해서 넘어오는 값을 변수로 저장 ) > 웹에서 확인

@RequestParam 을 사용해서 input 태그에서 넘어오는 이름을 가지고 변수로 저장해서 사용.....

 

Controller 에서 최상단에 ex02 경로를 RequestMapping 으로 설정해주면서 하위에 동일 경로인 ex02 경로를 모두 생략할 수 있게 해준다

 

 

 

 

 

DTO 를 활용하여 파라미터 값을 받는 방법

 

DTO 생성 및 작성 ( getter / setter )

 

jsp 파일에 DTO 활용해서 넘길 폼 작성

 

Controller 에 DTO 를 활용하여 값을 받게끔 설정 >> jsp 파일 작성

 

전송 >> 확인

 

DTO 를 활용해서 받으면 넘어오는 파라미터의 이름과 DTO 의 변수 이름이 같으면 자동으로 값을 주입해준다

 


 

 

 

 

 

실습 예제

실습 예제

 

예제 풀이

프로젝트 생성 및 파일 세팅

 

버전 세팅

 

버전세팅 이후 프로젝트 업데이트 진행 ( 변경된 버전으로 사용하기 위해서 )

 

인코딩 오류 해결

 

Controller 에 index 페이지를 작성

 

register 에 대한 경로를 get 방식과 post 방식으로 분류하여 post 방식으로 들어오는 경우 회원가입 로직을 처리한 뒤 index 페이지로 반환

 

정상적으로 post 와 get 방식으로 들어오는 경우 경로를 나눠 출력하는 모습

 

입력 정보를 그대로 받아올 DTO 작성

 

Controller 에서 회원가입에 대한 정보를 DTO 객체로 받아온 뒤 Service 로 넘겨준다 >> Service 에서는 DAO 로 dto 객체를 저장하기 위해 넘겨준다 >> DAO 에서는 list 에 dto 객체를 저장한다

 

회원 목록보기 구현

 

Controller 에 경로 작성 후 list.jsp 에 넘겨줄 model 객체 만들어서 Service 에 전달 >> Service 에서는 DAO 에서 getList 메소드를 사용한 값을 model 에 list 라는 이름으로 저장한다 >> DAO 에서는 list 의 값을 리턴해준다

 

list.jsp 에 list 에 내용이 없을 시 출력될 내용과 내용이 있을 시 출력될 내용 작성

 

코드 실행
728x90

 

 

 

 

 

MVC2 모델

MVC2 모델

Controller : url 연결 역할

Service : 연산 역할

DAO : DataBase 접근 역할

 

Spring 동작 구조

 

클래스 파일 생성

 

root-context.xml 파일에 bean 객체를 생성한 뒤 서버를 재시작하니 Test.java 에 생성자가 실행되는 모습 > 즉, Test.java 객체가 서버가 실행될때 생성된다

추후에 root-context.xml 파일 안에 DB 관련된 설정을 하게된다 ( 서버 실행시 DB 객체를 생성해놓기 위해 )

728x90

+ Recent posts