티스토리 뷰

 

[ RoleMapper Interface and Impl ]

public interface RoleMapper {

	public int insertRole(RoleVO role);
	
	public RoleVO readRoleByRoleName(String roleName);
	
	public int deleteRoleByRoleName(String roleName);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bibidi.mapper.RoleMapper">
	
	<resultMap type="com.bibidi.domain.RoleVO" id="roleMap">
		<id property="number" column="role_number"/>
		<result property="number" column="role_number" />
		<result property="name" column="role_name" />
	</resultMap>
	
	<insert id="insertRole">
		INSERT INTO roles
		VALUES (seq_role.nextval, #{name})
	</insert>
	
	<select id="readRoleByRoleName" resultMap="roleMap">
		SELECT *
		FROM roles
		WHERE role_name = #{roleName}
	</select>
	
	<delete id="deleteRoleByRoleName">
		DELETE FROM roles
		WHERE role_name = #{roleName}
	</delete>
</mapper>

 

 

[ RoleMapper Tests ]

@RunWith(SpringRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class RoleMapperTests {

	@Setter(onMethod_ = @Autowired)
	private RoleMapper roleMapper;
	
	@Test
	public void testInsertRole() {
		RoleVO role = new RoleVO();
		role.setName("tName");
		
		log.info("THE NUMBER OF INSERTED ROLES : " + roleMapper.insertRole(role));
	}
	
	@Test
	public void testReadRoleByRoleName() {
		
		log.info(roleMapper.readRoleByRoleName("ROLE_ADMIN"));
	}
	
	@Test
	public void testDeleteRoleByRoleName() {
		
		log.info("THE NUMBER OF DELETED ROLES : " + roleMapper.deleteRoleByRoleName("tName"));
	}
}

 

 

[ UserRoleVO ]

@Data
public class UserRoleVO {

	private String userNumber;
	private String roleNumber;
}
// 수정 후
@Data
public class UserRoleVO {

	private String userId;
	private String roleName;
}

 - 처음엔 DB처럼 userNumber, roleNumber만으로 구성했는데, 실제 서비스를 제공하는 입장에서 생각해 볼 때 이러한 요소들이 전혀 필요가 없어서 당황스럽다. 저 번호들이 DB에선 무결성 관리에 유리함을 주고 나중에 비지니스가 변해도 유연하게 대응할 수 있는 구조를 짜도록 돕는데,, 실제 서비스를 제공하는 입장에선 어디 쓸 데가 없다. 실제 서비스에서 의미가 있는 건 어떤 아이디에 어떤 역할이 부여되어 있냐인데, 이건 userId와 roleName이다. 왜 서비스단과 Mapper단을 나눴는지 이해가 가기 시작했다. 처음엔 서비스단의 역할이라 해 봐야 DB에서 받은 데이터 그대로 보내주는 기능 정도밖에 더 있나 했는데, 이렇게 실제 필요한 데이터가 조금 다른 경우도 있고 기능 하나를 제공할 때 여러 Mapper를 이용해야 되는 경우도 있다. 다 나눠놓은 이유가 있었네.

 - userNumber, roleNumber로도 구현할 수 있긴 한데, 그러면 DB에 접속하는 횟수가 훨씬 늘어난다. 그리고 클래스 멤버변수의 의미도 약간 애매해지는 거 같기도 하다. userNumber, roleNumber, userId, roleName을 다 넣는 것도 생각해봤다. 근데 당장 필요없어 보이는 number들을 넣는 것이 의미가 있나 싶다. 나중에 혹시 필요한 때가 온다면 그때 추가하면 될 것 같다.

 

 

[ UserRoleMapper Interface and Impl ]

public interface UserRoleMapper {

	public int insertUserRole(UserRoleVO userRole);
	
	public int deleteUserRole(UserRoleVO userRole);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bibidi.mapper.UserRoleMapper">
	
	<insert id="insertUserRole">
		INSERT INTO users_roles
		VALUES (#{userNumber}, #{roleNumber})
	</insert>
	
	<delete id="deleteUserRole">
		DELETE FROM users_roles
		WHERE (user_number = #{userNumber} AND role_number = #{roleNumber})
	</delete>
</mapper>
// 수정 후

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bibidi.mapper.UserRoleMapper">
	
	<insert id="insertUserRole">
		INSERT INTO users_roles VALUES
		(
			(SELECT user_number FROM users WHERE user_id = #{userId}),
			(SELECT role_number FROM roles WHERE role_name = #{roleName})
		)
	</insert>
	
	<delete id="deleteUserRole">
		DELETE FROM users_roles WHERE 
		(
			user_number = (SELECT user_number FROM users WHERE user_id = #{userId})
			AND role_number = (SELECT role_number FROM roles WHERE role_name = #{roleName})
		)
	</delete>
</mapper>

 - VO를 정의해서 사용하니 VO 내에서 필요한 변수가 변해도 mapper 실제 구현 부분만 바꿔도 되니 이런 점이 확실히 편리하다. mapper interface가 변하지 않아 변경할 부분이 적다.

 

 

[ UserRoleMapper Tests ]

@RunWith(SpringRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class UserRoleMapperTests {

	@Setter(onMethod_ = @Autowired)
	private UserRoleMapper userRoleMapper;
	
	
	@Test
	public void testInsertUserRole() {
		// 3은 bibidi, 22는 ROLE_ADMIN_NOTICE
		UserRoleVO userRole = new UserRoleVO();
		userRole.setUserNumber(3L);
		userRole.setRoleNumber(22L);
		
		log.info("THE NUMBER OF INSERTED USER ROLES : " 
				+ userRoleMapper.insertUserRole(userRole));
	}
	
	@Test
	public void testDeleteUserRole() {
		// 3은 bibidi, 22는 ROLE_ADMIN_NOTICE
		UserRoleVO userRole = new UserRoleVO();
		userRole.setUserNumber(3L);
		userRole.setRoleNumber(22L);
				
		log.info("THE NUMBER OF DELETED USER ROLES : " 
				+ userRoleMapper.deleteUserRole(userRole));
	}
}
// 수정 후

@RunWith(SpringRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class UserRoleMapperTests {

	@Setter(onMethod_ = @Autowired)
	private UserRoleMapper userRoleMapper;
	
	
	@Test
	public void testInsertUserRole() {
		UserRoleVO userRole = new UserRoleVO();
		userRole.setUserId("bibidi");
		userRole.setRoleName("ROLE_ADMIN_NOTICE");
		
		log.info("THE NUMBER OF INSERTED USER ROLES : " 
				+ userRoleMapper.insertUserRole(userRole));
	}
	
	@Test
	public void testDeleteUserrole() {
		UserRoleVO userRole = new UserRoleVO();
		userRole.setUserId("bibidi");
		userRole.setRoleName("ROLE_ADMIN_NOTICE");
				
		log.info("THE NUMBER OF DELETED USER ROLES : " 
				+ userRoleMapper.deleteUserRole(userRole));
	}
}

 

 

[ UserServicee 수정 ]

@Service
@Log4j
public class UserServiceImpl implements UserService {
	
	@Setter(onMethod_ = @Autowired)
	private UserMapper userMapper;
	
	@Setter(onMethod_ = @Autowired)
	private UserRoleMapper userRoleMapper;

	@Override
	public int registerUser(UserVO user) {
		
		log.info("registerUser.........");
		
		int result = userMapper.insertUser(user);
		
		if (result > 0) {
			UserRoleVO userRole = new UserRoleVO();
			userRole.setUserId(user.getId());
			userRole.setRoleName("ROLE_USER");
			
			result = userRoleMapper.insertUserRole(userRole);
		}
		
		return result;
	}

	@Override
	public UserVO getUserByUserId(String userId) {

		log.info("getUserByUserId...........");
		return userMapper.readUserByUserId(userId);
	}

	@Override
	public int increaseUserActivityScoreByUserId(String userId, Long points) {
		
		log.info("increaseUserActivityScoreByUserId...............");
		return userMapper.increaseUserActivityScoreByUserId(userId, points);
	}

	@Override
	public int decreaseUserActivityScoreByUserId(String userId, Long points) {
		
		log.info("decreaseUserActivityScoreByUserId.................");
		return userMapper.decreaseUserActivityScoreByUserId(userId, points);
	}

	@Override
	public int deleteUserByUserId(String userId) {
		
		log.info("deleteUserByUserId................");
		return userMapper.deleteUserByUserId(userId);
	}
	
}

 - 사용자가 등록되면 자동으로 사용자 권한도 같이 등록되도록 수정했다.

 - 사용자는 등록됐지만 오류가 발생해서 권한이 등록되지 않을 수 있다. Transaction 기능을 이용하면 처리할 수 있다고 한다. 나중에 오류 관련 처리하는 법을 배우고나서 같이 적용해볼 것.

 

[ ForumService 수정 ]

@Service
@Log4j
public class ForumServiceImpl implements ForumService {
	
	@Setter(onMethod_ = @Autowired)
	private ForumMapper forumMapper;
	
	@Setter(onMethod_ = @Autowired)
	private RoleMapper roleMapper;
	
	@Override
	public int registerForum(ForumVO forum) {

		log.info("register forum.........");
		
		int result = forumMapper.insertForum(forum);
		
		if (result > 0) {
			RoleVO role = new RoleVO();
			role.setName("ROLE_ADMIN_" + forum.getSlug().toUpperCase());
			result *= roleMapper.insertRole(role);
			
			role.setName("ROLE_MANAGER_" + forum.getSlug().toUpperCase());
			result *= roleMapper.insertRole(role);
		}
		
		return result;
	}

	@Override
	public ForumVO getForumByForumNumber(Long forumNumber) {

		log.info("get forum by forum number.........");
		return forumMapper.readForumByForumNumber(forumNumber);
	}

	@Override
	public int modifyForum(ForumVO forum) {

		log.info("modify forum...............");
		return forumMapper.updateForum(forum);
	}

	@Override
	public int deleteForumByForumNumber(Long forumNumber) {

		log.info("delete forum by forum number.............");
		
		int result = forumMapper.deleteForumByForumNumber(forumNumber);
		
		if (result > 0) {
			String slug = forumMapper
					.readForumByForumNumber(forumNumber)
					.getSlug()
					.toUpperCase();
			
			result *= roleMapper.deleteRoleByRoleName("ROLE_ADMIN_" + slug);
			result *= roleMapper.deleteRoleByRoleName("ROLE_MANAGER_" + slug);
		}
		return result;
	}
	
}

 - 게시판이 등록되면 그와 관련된 권한도 등록되도록 구현했다. 그러나 유저 등록과 비슷하게 게시판만 등록되고 관련 권한은 등록되지 않을 수도 있다.

 

 

[ Tests ]

 - UserServiceTests도 잘 돌아가고 실제로 프런트에서 회원가입을 진행해도 잘 돌아간다. spring이란 아이디로 회원 가입을 했다.

 

 

 

 

 

 

 

 

 

 

 

 

'(구)게시판 프로젝트' 카테고리의 다른 글

댓글, 대댓글  (1) 2021.05.11
게시글(updated 21.06.01)  (0) 2021.05.07
(멀티)게시판  (0) 2021.05.04
이름 짓는 법 총 정리  (1) 2021.04.28
메인 화면  (0) 2021.04.27
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함