MemberServiceImpl 클래스에 DTO 객체 생성하여 사용자가 입력한 값을 저장 ( 취미는 합으로 결정 : 만약 음악, 영화 두 개를 선택했다면 3 값을 저장 )
MemberServiceImpl 에 DAO 변수 선언 및 생성자 선언하여 dao 객체화
DAO 객체 생성하여 저장된 값을 가지고 있는 dto 객체를 매개변수로 넘김
module-info 에 java.sql 추가 ( import 로 자동으로 추가되지 않으므로 프로젝트 우측 클릭 해서 자동으로 module-info 생성하거나 직접 넣어줘야 함 )
위 코드 실행 시 오류코드 발생 ( ojdbc8 을 추가해주지 않았기 때문!!! )
ojdbc8 을 추가해줘야 함 ( DB 와 연동하기 위해서 )
DB 연결 성공
쿼리문 작성하여 dto 객체에 저장된 값을 DB 에 저장
코드 실행 영상
age 컬럼의 값이 10 바이트라 20대 미만, 50대 이상 은 12 바이트 값이라 저장이 되지 않는 오류가 발생 > age 컬럼의 값을 늘려주면 해결 완료
- 무한 로딩 오류 발생 -
※ DB 에 데이터를 저장하고 다시 확인하려 sqldeveloper 로 쿼리문을 사용해서 테이블의 행을 삭제한 뒤 다시 데이터 추가를 시도하니 무한 로딩이 발생함 > sqldeveloper 에서 쿼리문을 실행한 뒤 commit 해주지 않아서 eclipse 에서 커밋이 진행될때까지 로딩을 반복함 > sqldeveloper 는 무조건 쿼리문 작성한 뒤 commit 을 해줘야 함!! ※
>>> 테이블 생성, 테이블의 정보 수정은 커밋이 필요하지 않지만 값에 대한 수정은 무조건 커밋을 해줘야 한다!!!
DAO 에서 실행 결과를 성공 : 1 , 실패 : 0 으로 반환받아 MemberServiceImpl 에서 처리
이제 어제 로그인을 가상의 데이터로 연결해 놓은 부분을 실제 DB 와 연동
LoginServiceImpl 에 DAO
javaFX 에서 사용자가 입력한 아이디 값을 받아 dao 의 getUser 메소드에 전달하여 확인한 뒤 반환된 dto 값을 저장
getUser 메소드를 LoginDAO 클래스에 생성
LoginDAO 에 사용자가 존재한다면 값이 담긴 id, pwd, name 이 담긴 dto 값 반환, 사용자가 존재하지 않는다면 null 값이 담긴 dto 를 반환
코드 실행 영상
알림 창은 모든 클래스에서 동일하게 사용하는 것이니 CommonService 인터페이스로 따로 구현 ( 인터페이스에 메소드를 static 으로 실체화는 할 수 있음, 일반적인 메소드는 구현 불가능 )
기존에 LoginServiceImpl 에서 따로 사용하던 alert 주석 처리 이후 CommonService 에 구현한 alert 로 대체
MemberServiceImpl 에서 Alert 가 필요한 부분에 CommonService 인터페이스에 생성한 알림창 메소드 사용
MemberServiceImpl 에서 Alert 가 필요한 부분에 CommonService 인터페이스에 생성한 알림창 메소드 사용
스테이지를 닫는 코드도 중복되므로 따로 CommonService 인터페이스에 static 으로 구현하여 고용으로 사용
LoginServiceImpl 에 기존에 창 닫는 코드 주석처리 후 CommonService 에 구현한 코드 적용
MemberServiceImpl 에 기존에 창 닫는 코드 주석처리 후 CommonService 에 구현한 코드 적용
생성한 버튼 클릭 후 우측에 코드의 On Action 에 btnFunc 입력하여 btnFunc 함수와 연동 ( btnFunc 함수는 연동된 ex01 패키지의 Controller 클래스에 생성해줘야 한다 )
텍스트 필드에 fx:id 에 tf 입력
좌측 하단의 Controller 에 Controller class 를 ex01.Controller 클래스로 연동 후 저장
fxml 파일에 정상적으로 코드가 저장된 것 확인
작성한 fxml 파일을 scene 에 등록
Controller 에 btnFunc 함수 추가 후 module-info 파일에 직접 controls 추가해줘야 함
어노테이션 사용하여 텍스트 필드 와 메소드를 연동
.getText() 메소드로 사용자가 입력한 값을 얻어온 뒤 .setText("") 를 이용하여 입력 창을 공백 값으로 비워준다
코드 실행 모습
<!-- 오류 발생 --!>
SceneBuilder 에서 버튼과 텍스트 필드를 생성하고 저장했을때 자동으로 import 될때 javafx 패키지의 TextField 가 아닌 다른 패키지의 TextField 가 import 되어 오류가 발생되었으니 저장 후 fxml 파일 확인할때 import 목록을 확인해봐야 한다!!!!
텍스트 필드 하나 더 추가 후 fx:id 를 tf02 로 설정
기존에 생성했던 텍스트 필드의 우측 Properties 열어서 Editable 체크 해제 ( 입력할 수 없게끔 설정, 읽기 전용으로 설정 )
tf02 에 입력된 내용을 기존의 텍스트 필드인 tf에 출력
Alert 클래스 사용하여 알림창도 출력되게 설정
코드 실행 영상
DAO, DTO, Controller 로 분리하기
파일 세팅
패키지 우측클릭해서 module-info 자동 추가
fxml 파일 scene builder 로 오픈 후 AnchorPane 크기 설정
라벨, 텍스트 필드 생성 후 AnchorPane 안에 HBox 생성하여 아래 버튼 3개 만들 공간 확보
생성한 HBox 내에 버튼 3개 생성 ( 확인, 취소, 회원가입 )
HBox 의 Properties 에서 정렬을 TOP_CENTER 로 변경
버튼들 간의 간격도 HBox 의 Layout 탭에서 Spacing 값 조절하여 설정
텍스트 필드의 Properties 탭에서 Prompt Text 에 회색 글씨로 들어갈 글씨 입력 ( 글씨 입력 시 사라질 글씨 )
아이디 입력할 텍스트 필드 fx:id 를 fxId 로 설정
비밀번호 입력할 텍스트 필드 fx:id 를 fxPwd 로 설정
각 버튼별 On Action ( 연결될 메소드 ) 설정
각 버튼별 On Action ( 연결될 메소드 ) 설정
각 버튼별 On Action ( 연결될 메소드 ) 설정
연결될 Controller 클래스 설정
fxml 파일에 코드 정상적으로 들어갔는지 확인, Controller 파일에 미리 버튼과 연동될 메소드 생성
Main 클래스에 fxml 파일 불러오기
fxml 파일과 MainClass 의 패키지를 분리하였으므로 기존의 getClass() 메소드로는 경로를 load 할 수가 없다.
Paths 클래스를 사용하여 경로를 불러온 뒤 뒤에 추가적인 경로들을 직접 붙여준다.
※ Paths.get("").toAbsolutePath().toString() 을 사용하여 현재 프로젝트의 절대 경로를 가져온 것 ※
프로젝트 하위의 bin 폴더까지의 경로는 계속 사용할 것이므로 login.url interface 에 선언
인터페이스에 설정한 경로로 MainClass 에서 bin 까지는 대체해서 사용
Controller 클래스에 Initializable 를 implements, 초기화 메소드를 오버라이딩
컨트롤러에 fxml 파일에 생성한 텍스트 필드를 연동
컨트롤러 객체를 생성
취소버튼 눌렀을때 실행되는 메소드 작성
임의로 담아둘 id, pwd, name 생성 및 setter / getter 생성
임시 데이터를 저장할 Map 생성 및 데이터 저장
입력 값이 확인 누르면 잘 받아와지는지 확인
키 값 입력시 객체값이 나오는지 확인 ( aaa3 은 없는 아이디 이기 때문에 null 반환 ) DAO 에 생성한 키는 aaa0 ~ aaa2 까지
로그인 구현 ( 알림창으로 로그인 성공, 실패, 비밀번호 틀렸을 경우 출력 )
코드 실행 화면
Controller 클래스에 구현해놓은 서비스 메소드를 LoginService 로 옮길 것임
기존에 Controller 클래스에 있던 메소드들을 LoginServiceImpl 로 필요한 매개변수들을 전달하여 사용
회원가입 부분 구현
회원가입 fxml 생성하여 기능 추가하기 ( 각 클래스, 인터페이스 파일과 fxml 위와 같이 세팅하기 )
LoginService 클래스의 registerFunc 메소드를 사용하면 회원가입 클래스의 메소드를 호출
MemberMain 클래스에 스테이지를 하나 새로 생성 후 member.fxml 를 씬에 등록 및 show 로 회원가입 버튼 누를 시 출력되게 설정
MemberController 에 회원가입 버튼, 취소 버튼 누를 때 실행될 메소드 미리 선언
사용중인 스테이지를 그대로 사용하며 회원가입 클릭 시 새 창을 띄우지 않고 창을 전환시키는 방법
LoginService 에 registerFunc 메소드 실행될때 root 값을 전달
컨트롤러에서도 registerFunc 실행할때 root 값 전달하게끔 설정
인터페이스에도 root 값을 받는 메소드 추가
회원가입을 눌러 MemberMain 클래스의 viewFx 가 호출될때 root 값을 넘겨받으므로 해당 값으로 처리하면 됨
기존엔 창이 하나 더 생성되며 회원가입 창이 열렸으나, 위와 같이 Main 에서 사용하던 root 의 값을 받아서 처리하니 새로운 stage 가 생성되어 열리는게 아닌 기존의 stage 가 변환되는 모습
연령선택 콤보 박스에 텍스트 추가
회원가입 버튼 클릭 시 콤보 박스의 값 잘 받아오는 것 확인
컨트롤러에서 받아올 값들 전부 객체로 생성 ( 어노테이션으로 fxml 과 객체명을 동일하게 하여 연동 )
콤보박스가 체크되지 않았거나 아이디가 입력되지 않으면 해당 창으로 이동하게끔 세팅, 각 입력 값 출력
코드 실행 영상
컨트롤러에 만들어 놓은 서비스 부분을 모드 MemberServiceImpl 로 옮겨서 사용할 것임 ( 이때, 각 매개변수를 따로 전달하는게 아니라 모든 입력 값을 가진 root 를 넘겨 받아서 값들을 처리할 것임 )
MemberMain 의 viewFx 메소드가 호출될 때 컨트롤러에 root 값을 전달
Controller 클래스는 전달받은 root 값을 MemberService 인터페이스로 전달
MemberService 인터페이스에서 root 를 전달받는 메소드를 정의
MemberService 에서 넘겨받은 root 값을 1 에서 저장, 2 에서 각 값을 저장받을 변수를 생성, 3 에서 root 에서 각 값을 Id 를 일치시켜 받아와 저장