티스토리 뷰
[ 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
- 백준 16562
- 백준 1106
- boj 9345
- 부트 캠프
- 백준 9345
- 제로베이스 백엔드 스쿨
- Ugly Numbers
- 백준 2336
- 제로베이스 스쿨
- 백준 10473
- 터보소트
- 백준 3006
- boj 3006
- 인간 대포
- 백준 12713
- boj 2336
- boj 12713
- boj 1280
- 백준 2243
- 백준 1280
- boj 1106
- 디지털 비디오 디스크
- 백준 14868
- 사탕상자
- boj 2243
- boj 10775
- 백준 10775
- boj 14868
- boj 10473
- boj 16562
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |