3rd day of mini project

2023. 9. 15. 21:34
728x90

1. 회원가입 수정하기. 

*** 일단 그것보다도 애초에 DB table을 잘못 생성해서 다시 드랍했다가 다시 만듦.........

시퀀스도 삭제했다가 다시 만들었다. 우우~

CREATE TABLE USERS (
   id NUMBER PRIMARY KEY,
   userId VARCHAR2(50) UNIQUE NOT NULL,
   password VARCHAR2(200) NOT NULL,
   username VARCHAR2(100) NOT NULL,
   nickname VARCHAR2(50) NOT NULL,
   birthdate DATE,
   phone VARCHAR2(15),
   email VARCHAR2(100),
   address VARCHAR2(300),
   userrole VARCHAR2(5) CHECK (userrole IN ('USER', 'ADMIN')),
   regdate DATE DEFAULT SYSDATE
);

CREATE SEQUENCE USERS_SEQ
  START WITH 1
  INCREMENT BY 1
  NOCACHE;

괜히 _추가해놓은거 다 빼버렸다.

그리고 userole에서는 CHAR > VARCHAR2로 변경.... 이상하게 인식이 안됐다.

에러로 배우는 인생.

 

일단 여기서 중요한 포인트 여러가지

1) USERROLE을 둘 중 하나로 선택하도록 유저롤 enum 만들기. 

package com.nctclub.model;

public enum UserRole {
// enum 두가지 유저와 관리자
    USER("USER"),
    ADMIN("ADMIN");

    private final String role;

    UserRole(String role) {
        this.role = role;
    }

// getRole 메소드 
    public String getRole() {
        return this.role;
    }

    public static UserRole fromString(String role) {
        for (UserRole userRole : UserRole.values()) {
            if (userRole.getRole().equalsIgnoreCase(role)) {
                return userRole;
            }
        }
        throw new IllegalArgumentException("No constant with text " + role + " found");
    }
}

 

2) JDNI 설정하기

applicationContext.xml 파일에서 JDNI를 설정해주었다. 이유는? dataSource에서 데이터를 가져오는데 그 때마다 connection을 생성하여 커넥션 연결을 하면 불필요한 연결이란 것............ !!

그럴 때 JDNI를 설정해준다고 한다. >> 요부분은 따로 블로깅을 했다. 

<!-- JDNI설정 -->
	<bean id = "dataSource"	class = "org.springframework.jndi.JndiObjectFactoryBean">
		<property name = "jndiName" value = "java:comp/env/jdbc/oracle"/>
	</bean>

https://hehesim.tistory.com/27

 

JDBC와 DBCP(DataBase Connection Pool)

1. JDBC (Java DataBase Connectivity) : 데이터베이스와 연결하여 데이터를 송수신할 수 있도록 하는 인터페이스 다양한 종류의 관계형 데이터베이스에 접속하여 SQL문을 수행처리할 때 표준 SQL 인터페이

hehesim.tistory.com

 

3) 여기서 MyBatis 사용까지 해야하므로... 더욱 발전시킨다. 

applicationContext.xml 파일 변경하였다.

<!--  jdbc 설정 (DataSource : 데이터베이스) -->
	<bean id = "dataSource" class = "org.springframework.jdbc.datasource.SimpleDriverDataSource">
		<property name="driverClass" value = "${driver}"/>
		<property name="url" value = "${url}"/>
		<property name = "username" value = "${username}"/>
		<property name = "password" value = "${password}"/>
	</bean>
	
	<!-- db.properties 파일 연결-->
	<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<!-- property는 setter 메소드와 같다 -->
		<property name="locations" value="/WEB-INF/mybatis/db.properties"></property>
	</bean>
	
	<!--  MyBatis SqlSessionFactory 설정 -->
	<bean id = "sqlSessionFactoryBean" class = "org.mybatis.spring.SqlSessionFactoryBean">
		<property name = "dataSource" ref = "dataSource"/>
		<property name = "configLocation" value = "/WEB-INF/mybatis/config.xml"/>
	</bean>

위의 JDNI 설정을 지우고

> JDBC bean 설정

> db.properties 파일을 만들어 파일 연결.

> 그리고 MyBatis SqlSessionFactory를 설정했다. 

 

그리고 MyBatis 폴더를 만들어 그 안에 db.properties, config.xml 파일을 집어넣었다.

db.properties > 에는 driver, url, username, password 정보 집어넣기

 

>> 그렇게 되면 UserController에서 구현이 훨씬~ 짧아진다.

 

그리고 기능을 세부적으로 나누기 시작했다. 

예를 들어 회원가입이라고 하면...?

1) UserController에서는 registerform에서 입력된 데이터를 (@ModelAttribute)를 통해 UserDTO에 매칭이 되도록 하고 그후 어떤 페이지로 넘어가도록 제어 역할만 한다.

2) 그럼 회원가입하는 자세한 기능은...? UserService에서 구현. UserService는 인터페이스로 만들어 구현을 하는데, 이때 

비밀번호가 누구에게도 노출되지 않아야 한다. 암호화가 되어 >> UserDTO로 넘겨주어야 함. 그렇다면 >> 암호화시키는 과정을 Serivce차원에서 구현을 해야 한다. + 또한, UserRole을 정해주는 것도 이곳에서. 

3) 이렇게 어떤 절차를 모두 걸치고서야 넘어온 DTO 내용을 결과값으로 넣고 main창으로 돌아가도록 만들었다. 

 

이 flow~를 잊지말길.

 

2. 로그인 기능 구현하기....

회원가입의 업그레이드 버전 같았다. 어느정도 이해를 한 부분에서는 따라서 만들면 되는거 같은데 여기서 어려운 문제가 여러개 나왔다. 

 

1) 일단 프론트 화면을 만들었다. 대충 ~ 회원가입폼과 비슷하게 구성해놓고.

 

2) UserController 에도 (@RequestMapping) 활용하여 넣어두었다. loginform >으로 가서 정보 받아오고 그러면 똑같이 그 결과값에 따라 이동하는 형태.

 

3) 그렇다면 정보받아오는 기능을 가진 userService로 가보자.  > userSerive의 userLogin 메서드 생성.

> 요때 핵심 기능은 받아온 정보에서 아이디/비밀번호가 DB에 있는 아이디/비밀번호와 비교하여 같으면 로그인 성공/ 다르면 로그인 실패의 알림이 뜨도록 만들어야 한다. 

 

>> 그렇다면 db에서 정보를 가져오는 sql문을 써야하니까~~~~~ mapper를 등장시킨다. 그리고 (@Autowired) 애너테이션을 써서 값을 주입시킨다. 또 새로운 개념...오아ㅏㅏ 배울 것이 산더미야 산더미.

무튼 또 applicationContext.xml에 가서 <mybatis-spring:scan base-package="com.nctclub.mapper" /> 적어줌.

 

@Override
	public UserDTO userLogin(UserDTO dto) {
		
        
        // DB의 로그인 정보를 가져오도록 한다 (userLogin에서 select *하는 쿼리문을 가져옴)
	    UserDTO loginDto = mapper.userLogin(dto);
        // 가져온 정보가 null이라면 로그인 불가능.
	    if(loginDto == null) {
	        return null;
	    }
        
        // DB로그인 정보의 pw와 입력한 pw값을 비교해야함. 
	    String inputPw = dto.getPassword(); 
	    String dbPw = loginDto.getPassword(); 
	    
        
        // 이거는 pwEncoder.matches를 사용해서 확인가능. 
        // (이미 암호화되었기 때문에 복호화해서 비교까지 해주는 메소드 사용해야 한다)
	    if(pwEncoder.matches(inputPw, dbPw)) {
	        return loginDto; // 그때 일치한다면 리턴값을 UserDTO로 준다. 
	    }
	    return null;
	}

이렇게 login확인 과정을 거치고 UserController로 가서

이 리턴값이  null이 아니라면 그때 Session을 만들어서 main으로 redirect한다.

@RequestMapping(value="/login", method = RequestMethod.POST)
    public String loginProcess(UserDTO dto, HttpServletRequest req, Model model) {
    	
       UserDTO result = userService.userLogin(dto);
       
       if(result !=null) {
    	   HttpSession session = req.getSession();
           session.setAttribute("loginDto", result);  
           System.out.println(result);
           return "redirect:main";
       }
        model.addAttribute("errorMessage", "아이디 또는 비밀번호가 틀렸습니다.");
        return "loginform";
    }

그리고 아니면 그때는 에러메시지가 뜨도록 한다. > 요때 model.addAttribute를 사용해서 > 프론트와 연결해준다....

그러면 프론트인 loginform.jsp로 가서 알림메시지를 넣어준다.

       <p class = "text-danger">${errorMessage}</p>

꺅~~~~

요렇게 끝.

 

3. 회원 정보 조회 기능 구현..

하나씩 해보자.....................

 

이제 ADMIN 등장~~~~~~~~~~~~~~~~~~~ 관리자씨가 할 일은 첫째 회원 정보 조회 가능. 그리고 삭제도 가능...

낑낑대며 혼자 해보았ㄷㅏ... 어렵지만 재밌어.

 

똑같이 

1) AdminController 

2) sql 문 써야하니까 UserMapper에 추가 (selectAllusers)

3) AdminService interface + java class file

4) userListForm.jsp

>> 만들면 된다.

 

1) AdminController

@Autowired
	AdminService adminService;
	
	@RequestMapping(value = "/userlist", method = RequestMethod.GET)
	public String selectall(Model model) {
		List<UserDTO> members = adminService.selectAllUsers();

		model.addAttribute("memberList", members);
		
		return "userListForm";
	}

갖고온 유저리스트를 model.addAttribute활용해서 memberList에 넣고 >> 얘는 프론트로 가져가....고

userListForm > 으로 간다. 

 

2) userMapper에 selectAllusers "   SELECT * FROM users" 추가

 

3) AdminService에도 selectAllUsers 메소드 추가 >> 유저 정보를 DB에서 리스트로 갖고온다. 

 

4) 마지막으로 프론트에 가지고오기

<c:forEach var = "member" items="${memberList}">
                <tr>
                    <th>${member.userId}</th>
                    <th>${member.username}</th>
                    <th>${member.nickname}</th>
                    <th>${member.birthdate}</th>
                    <th>${member.phone}</th>
                    <th>${member.email}</th>
                    <th>${member.address}</th>
                    <th>${member.regdate}</th>
                    <th><button type="button" class="btn btn-dark d-block mx-auto">회원 삭제</button></th>
                </tr>
</c:forEach>

forEach 갖고와서 ~ 각 항에다 넣어주기. 

 

 

진짜 여기까지 끝.........................

힘두렀다..........................................................................

흐름만 잘 이해하자 ! 

 

>,,,,<주말 힘내서 놀아야지...빠이팅

 

728x90

BELATED ARTICLES

more