An open API service indexing awesome lists of open source software.

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 를 구현했습니다.

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. 글 목록
DB
글목록

**컨트롤러**

```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})

```

글작성_완료
글작성_완료2

> 글 작성이 정상적으로 된 것을 확인할 수 있습니다.

> 로그인 후에는 '로그인', '회원가입' 버튼이 '로그아웃' 버튼으로 바뀐 것을 볼 수 있습니다.

### 5. 글 수정 & 글 삭제
글상세_타인

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

글상세

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

**글상세.jsp**

```jsp



수정



삭제

```

글수정
글수정_완료

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

글삭제

> 글삭제가 정상적으로 된 것을 볼 수 있습니다.

### 6. 페이징처리
글작성_완료2
페이징처리_중간

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

페이징처리_끝

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