토이 프로젝트/Spring&Java 갖고놀기

Spring - DB 구조 변경 및 회원가입 스크립트 수정

TerianP 2022. 2. 25.
728x90

 

오늘 내용의 포인트!!

DB 테이블 설계는 미리미리

- DB 와 테이블, 컬럼명은 처음에 사이트를 만들때부터 만들어두어야 한다는 것을 뼈저리게 깨달았다. 물론 함부로 DB 를 고쳐서는 안된다는 것을 일하면서 알기는 알았는데...설마 이렇게까지 스노우볼이 클 줄은 정말 몰랐다. 단순히 아주 단순히 테이블 명도 아니고 컬럼 명만 몇몇개 바꿨을 뿐인데 고쳐야하는 부분이 여기저기에서 계속 속출했다. 특히나 Spring - Member 테이블쪽과 2차로 메일 서버와 연동되는 부분에서도 정말 많은 부분을 고쳐야했다.

- DB 는 절대 함부로 고치는게 아니며, 단순히 컬럼명을 변경하는 것만으로도 스노우볼이 엄청나고, 처음부터 테이블 구조 설계를 잘해서 만들어야한다!!

 

1. DB 구조 변경

  • 현재 DB 구조는 컬럼명도 이상하고 DB 와 테이블, 컬럼명과 일치성도 부족해서 전반적으로 뜯어고쳤습니다.
  • 아래는 앞으로 사용될 DB 구조입니다.

 

MEMBER 테이블 

1) 기존 MEMBER 테이블

2) MEMBER 테이블 수정 쿼리

## 0) 테이블명 변경
RENAME TABLE `member` TO `MEMBER`;

## 1) 전체 컬럼명 변경
ALTER TABLE `MEMBER`
	CHANGE COLUMN `NAME` `MNAME` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_general_ci' AFTER `MEMBER_CODE`,
	CHANGE COLUMN `ID` `MID` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_general_ci' AFTER `MNAME`,
	CHANGE COLUMN `PASSWD` `MPASSWD` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_general_ci' AFTER `MID`,
	CHANGE COLUMN `SEX` `MGENDER` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci' AFTER `MPASSWD`,
	CHANGE COLUMN `EMAIL` `MEMAIL` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci' AFTER `MGENDER`,
	CHANGE COLUMN `EMADDRESS` `MEMADDRESS` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci' AFTER `MEMAIL`,
	CHANGE COLUMN `RDATE` `MRDATE` DATE NOT NULL DEFAULT current_timestamp() AFTER `MEMADDRESS`;

3) 수정 후 MEMBER 테이블

 

MAILBOX 테이블

  • 여기서 VIRTUAL_USERS 와 VIRTUAL_DOMAINS 로 테이블 명을 변경하게되면 postfix 쪽에서 설정해두었던 sql 내용들에 대해서도 수정해야합니다.
  • 또한 mailbox 쪽 password 컬럼은 해당 컬럼명으로 고정이라고 합니다. 다른 컬럼명으로 하면 에러가 발생하네요ㅠ

 

1) 기존 VIRTUAL_USERS 테이블

 

2) 테이블 수정 쿼리

## 0) 테이블명 수정
RENAME TABLE `virtual_users` TO `VIRTUAL_USERS`;

### 테이블 컬럼명 수정 ###
ALTER TABLE `VIRTUAL_USERS`
	CHANGE COLUMN `email` `MWEBMAIL` VARCHAR(120) NOT NULL COLLATE 'utf8_general_ci' AFTER `MPASSWD`,
	CHANGE COLUMN `box` `MBOX` VARCHAR(120) NOT NULL COLLATE 'utf8_general_ci' AFTER `MWEBMAIL`,
	DROP INDEX `email`,
	ADD UNIQUE INDEX `email` (`MWEBMAIL`) USING BTREE;

3) 수정 후 VIRTUAL_USERS 테이블

 

TRIGGER 수정

  • 앞에 MEMBER 과 VIRTUAL_USERS 가 수정됨에 따라서 수정한 TRIGGER 내용
CREATE OR REPLACE TRIGGER `new_mailuser` AFTER INSERT ON `MEMBER` FOR EACH ROW begin
INSERT INTO mailbox.virtual_users
   (`domain_id`, `password` , `MWEBMAIL`, `MOBX`, `MEMBER_CODE`)
VALUES
   ('1', ENCRYPT(NEW.MPASSWD, CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), CONCAT(NEW.MID, '@mail.hjproject.kro.kr'), NEW.MID, NEW.MEMBER_CODE);
END

2. application.properties

  • 기존 내용에서 JPA Setting 부분 중 아래 내용을 추가해주자
  • 이는 JPA 를 사용할때 엔티티 - Entity - 생성 시 변수 명을 카멜타입 - UserId - 을 언더바 형식 - User_Id - 로 자동 변경해서 매핑해준다고 한다.
  • 이는 JPA 기본타입이 카멜형인데 반해 DB쪽은 기본형으로 언더바를 사용하기 때문이라고 한다. 이때 아래 내용을 추가해주면 이러한 자동 변경없이 변수명과 DB 컬럼명을 그대로 매핑하게 해준다.
    • 이 설정이 필요했던 이유가 DB 컬럼명을 모두 대문자로 변경함에 따라서 Member 클래스의 변수도 모두 대문자로 해두었는데...이게 문제가 되었던 것인지 spring 실행 시 DB에서 member 테이블을 찾을 수 없다는 오류가 나왔다. 이후 검색을 하던 도중 아래 내용을 추가하라는 것을 발견했고, 오류를 해결 할 수 있었다.
# JPA settting
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

3. LoginController 수정

  • 로그인 시도 시 LoginMember 값이 null 일 때 즉, 로그인 아이디와 패스워드가 틀렸을 경우 얼럿을 띄울 수 있도록 코드 수정
  • 수정된 부분은 if 문 전체이다.
  • 이번에는 ajax - json 을 통해 받고 뭐하는 과정을 사용하지 않고, 바로 java 코드를 통해 alert 을 띄울 수 있도록 했다.
    • 지난번에는 ajax - json 을 활용해서 페이지에서 버튼을 클릭을 때 해당 값을 java 서버단으로 넘겨받고 DB에 정보와 조합, 검증해서 다시 페이지로 넘기고 alert 을 띄우는 것이었다.
    • 이번에도 솔직히 저렇게 하고 싶었는데 도저히 그렇게 안되서 차선책으로 java 서버단에서 코드를 이용해 alert 을 띄우게 만들었다.
    • 점점 가면서 모르는 것만 늘어나고ㅋㅋㅋ뭔가 되는지 안되는지 모르겠지만...그래도 우선 하나씩 만들어간다는 것에 의의를 두려고한다
  • PrintWriter 을 사용하면 java 단에서 javascript 를 사용가능하다!!
    • 이렇게하면 html 에서 java 서버로 로그인 정보 전달 -> java 단에서 loginMember 정보 검증 -> null 이면 로그인 불가 alert , 정보확인 시 세션 만들고 로그인 진행 순으로 진행되는듯하다.
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String loginWithHttpSession(@ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletRequest request, HttpServletResponse res) throws IOException {
        JSONObject jso = new JSONObject();
        // 에러 관리 메서드(아직 사용 X)
//        if (bindingResult.hasErrors()) {
//            return "members/login";
//        }

        // 1. loginForm 을 통해 로그인 정보들을 가져옴
        Member LoginMember = loginService.login(form.getLoginid(), form.getLoginpw());

        Map<String, Object> result = new HashMap<String, Object>();

        if (LoginMember == null) { // login 메서드에서 던져주는 값이 null 이면 로그인 실패
//            bindingResult.reject("login Fail", "아이디 또는 비밀번호가 맞지 않습니다");
            System.out.println("로그인 실패");

            res.setContentType("text/html;charset=utf-8");
            // printWiter 객체는 java 단에서 javascript 를 사용할 수 잇게해주는 객체이다
            // memberController 에서의 내용도 마찬가지로 이를 사용한 것. 
            PrintWriter out = res.getWriter();

            result.put("state", "fail");
            // out.println 으로 사용하자
            out.println("<script>alert('로그인 실패!! 계정 정보를 확인해주세요');</script>");
            out.flush(); // printwriter 종료
            
            return "members/login";

        }

 


4. Login.html

  • javascript 를 사용해서 아이디/패스워드에 값을 입력하지 않고 로그인을 눌렀을 때 각각 아이디가 없다 / 패스워드가 없다 라는 얼럿을 출력하도록 변경
    <form class="login-form" id="loginForm" action="/login" method="post" onsubmit="return fn_submitChk();">
      <input type="text" id="loginid" name="loginid" placeholder="아이디"/>
      <input type="password" id="loginpw" name="loginpw" placeholder="비밀번호"/>
      <button>로그인</button>
      <script th:inline="javascript">
            function fn_submitChk(){

            if(loginForm.loginid.value == ""){
                loginForm.loginid.focus();
                alert("아이디가 없어요ㅠ.ㅠ 다시 입력해주세요");
                return false;
                }
            if(loginForm.loginpw.value == ""){
                loginForm.loginpw.focus();
                alert("패스워드가 없어요ㅠ,ㅠ 다시 입력해주세요");
                return false;
                }

            }
            </script>

 

보다 자세한 변경 사항과 코드는 제 git에 올려두었습니다.

https://github.com/SeJonJ/My_Web

 

GitHub - SeJonJ/My_Web: Spring 을 통한 웹 개발

Spring 을 통한 웹 개발. Contribute to SeJonJ/My_Web development by creating an account on GitHub.

github.com

 


참고

- JPA 세팅 관련

https://dev-elop.tistory.com/entry/springjpahibernatenamingphysical-strategy-%EC%A0%84%EB%9E%B5-%EB%B3%80%EA%B2%BD

 

spring.jpa.hibernate.naming.physical-strategy 전략 변경

JPA를 적용하고 나서 Entity(=VO) 생성 시 변수 명을 그대로 매핑 안하고 카멜을(UserName = user_name) 언더바 형식으로 자동 매핑해준다. 가끔 이 부분이 불편해서 변수 명과 DB칼럼명을 그대로 매핑 하게

dev-elop.tistory.com

 

- JAVA alert 창

https://epthffh.tistory.com/entry/JAVA%EB%8B%A8%EC%97%90%EC%84%9C-alert%EC%B0%BD-%EB%9D%84%EC%9A%B0%EA%B8%B0

 

JAVA단에서 alert창 띄우기

오늘은 간단한 팁을 드리려고합니다 보통 submit 방식으로 데이터를 넘긴후 알림창을띄워줘야할떄가 있습니다. 페이지로 이동해서 해도되지만 ajax 방식이 아니라서 애매하게되죠 검색하면 PrintWr

epthffh.tistory.com

 

- DB 모델링하기 : 아래 사이트에서 DB 모델링을 할 수 있도록 지원해줍니다. 추가로 모델링이 다 되면 SQL 파일로 떨궈줘서 DB에 가서 바로 적용할 수 있다고하네요ㅠ.ㅠ

알았다면 미리 해볼껄...

https://sqldbm.com/Home/

 

SqlDBM - Online Database Modeler

SqlDBM - Online Database Modeler

sqldbm.com

 

댓글