https://github.com/dev-connor/spring-notice
스프링으로 로그인, 회원가입, 게시판의 CRUD 를 구현했습니다.
https://github.com/dev-connor/spring-notice
spring
Last synced: about 1 month ago
JSON representation
스프링으로 로그인, 회원가입, 게시판의 CRUD 를 구현했습니다.
- Host: GitHub
- URL: https://github.com/dev-connor/spring-notice
- Owner: dev-connor
- Created: 2022-02-10T05:50:04.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2022-03-06T14:32:23.000Z (over 4 years ago)
- Last Synced: 2025-02-28T19:27:09.636Z (over 1 year ago)
- Topics: spring
- Language: Java
- Homepage:
- Size: 210 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 게시판 프로젝트
주제: 게시판
툴: Spring framework, STS, Oracle, SQL Developer, Git&GitHub
개발인원: 개인
개발기간: 2022년 2월 10일 ~ 2022년 2월 16일 (일주일)
1. 컨트롤러, 서비스, 뷰의 MVC 패턴 구현
2. MyBatis 를 활용한 DB 연결
3. Spring security 를 활용한 로그인
4. 시큐리티의 BCryptPasswordEncoder 를 활용한 비밀번호 암호화
5. 게시판의 CRUD
6. 게시판의 페이징블록 처리
---
### 목차
1. 환경설정
- JDBC
3. 회원가입
- 비밀번호 암호화 처리
4. 글 목록
5. 글 작성 & 로그인
- Spring security 의 CSRF
- 로그인 권한처리
- 로그인상태에 따른 동적 화면구현
6. 글 수정 & 글 삭제
- 권한에 따른 수정/삭제
7. 페이징처리
### 적용된 다른 기능
1. 로그인과 DB 연결
9. 로그아웃 기능
---
### 1. 환경설정
#### JDBC
이번 프로젝트는 mybatis 의 커넥션 풀의 한 종류인 Hikari CP 를 사용합니다.
**WEB-INF/spring/root-context.xml**
```xml
io.github.dev_connor.domain.BoardVO
io.github.dev_connor.domain.MemberVO
io.github.dev_connor.domain.AuthVO
```
### 2. 회원가입

> 아이디에 ryan, 비밀번호에 aa1234 로 회원가입을 합니다.

> 비밀번호가 암호화되어 DB 에 저장됩니다.
**WEB-INF/spring/security-context.xml**
```java
```
`BCryptPasswordEncoder` 스프링프레임워크의 패스워드 인코더를 사용합니다.
**컨트롤러**
```java
@Controller
@Log4j
@AllArgsConstructor
public class MemberController {
private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
private MemberService service;
@GetMapping("/join")
public void joinGET() {
}
@PostMapping("/join")
public String joinPost(MemberVO member) {
service.join(member);
return "redirect:/board/list";
}
}
```
**서비스**
```java
@Log4j
@Service
@AllArgsConstructor
public class MemberServiceImpl implements MemberService {
@Setter(onMethod_ = @Autowired)
private MemberMapper mapper;
@Setter(onMethod_ = @Autowired)
private PasswordEncoder pwencoder;
@Override
public void join(MemberVO member) {
String encodedPW = pwencoder.encode(member.getUserpw());
member.setUserpw(encodedPW);
mapper.join(member);
}
}
```
`pwencoder.encode` 비밀번호를 암호화합니다.
### 3. 글 목록
**컨트롤러**
```java
@Controller
@Log4j
@RequestMapping("/board/*")
@AllArgsConstructor
public class BoardController {
private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
private BoardService service;
@GetMapping("/list")
public void list(Criteria cri, Model model) {
int total = service.getTotal(cri);
model.addAttribute("list", service.getList(cri));
model.addAttribute("pageMaker", new PageDTO(cri, total));
}
}
```
**서비스**
```java
@Log4j
@Service
@AllArgsConstructor
public class BoardServiceImpl implements BoardService {
@Override
public List getList(Criteria cri) {
return mapper.getListWithPaging(cri);
}
}
```
**MyBatis**
```xml
(#{pageNum} -1) * #{amount}
]]>
```
INDEX 로 정렬하는 작업 없이 글목록을 불러옵니다.
### 4. 글 작성 & 로그인

> 로그인이 되어있지 않다면 글쓰기버튼을 클릭 시 로그인페이지로 연결됩니다.
#### - 글 작성 시 로그인 페이지로
**WEB-INF/spring/appServlet/servlet-context.xml**
```xml
```
**컨트롤러**
```java
@GetMapping("/register")
@PreAuthorize("isAuthenticated()")
public void register() {}
@PostMapping("/register")
@PreAuthorize("isAuthenticated()")
public String register(BoardVO board, RedirectAttributes rttr) {
service.register(board);
rttr.addFlashAttribute("result", board.getBno());
return "redirect:/board/list";
}
```
`@PreAuthorize("isAuthenticated()")` 어노테이션으로 로그인한 사용자만 글작성을 하도록 합니다.
#### - 로그인 CSRF
```jsp
Remember Me
```
> Spring security 에서는 모든 POST 방식의 form 태그에 CSRF 토큰이 필요합니다.

> 아까 가입한 ryan/aa1234 로 로그인합니다.
> 암호화된 비밀번호는 디코드되어 비밀번호가 일치하는지 확인한 후 로그인됩니다.
> 로그인 후에는 바로 글작성페이지로 이동됩니다.
**MyBatis**
```xml
select seq_board.nextval from dual
insert into tbl_board (bno,title,content, writer)
values (#{bno}, #{title}, #{content}, #{writer})
```

> 글 작성이 정상적으로 된 것을 확인할 수 있습니다.
> 로그인 후에는 '로그인', '회원가입' 버튼이 '로그아웃' 버튼으로 바뀐 것을 볼 수 있습니다.
### 5. 글 수정 & 글 삭제

> 다른사람의 글은 수정, 삭제할 수 없습니다.

> 자신의 글에는 수정, 삭제버튼이 생긴 것을 볼 수 있습니다.
**글상세.jsp**
```jsp
수정
삭제
```

> 글 수정이 완료된 후에는 글상세페이지로 이동됩니다.

> 글삭제가 정상적으로 된 것을 볼 수 있습니다.
### 6. 페이징처리

> 페이지의 중간에서는 이전버튼 (Previous) 과 다음버튼 (Next) 가 모두 보이는 것을 볼 수 있습니다.

> 반면에 처음과 마지막페이지에서는 이전버튼이나 다음버튼이 없도록 처리했습니다.