프로젝트는 크게 3가지로 나눌 수 있다.
이는 model, controller, service이다.
<요청하는 입장>
일단 앞으로 만들 게시판에서 사용할 database의 테이블은 3개이므로 필요한 front-controller도 3개가 필요하다.
Service를 구현할때 각 기능함수마다 필요한 파라미터가 다를 수 있다.
이렇게 다양한 정보들을 파라미터로 다 써서 주는 것이 아니라 object를 만들어 사용하는 것이 좋다.
-> Model을 생성한다.
알아보고 싶은 것 (1)
Model과 DTO의 차이점
알아보고 싶은 것 (2)
Model을 만들때 롬복 어노테이션 4개가 사용되는데 이 어노테이션의 의미
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
알아보고 싶은 것 (3)
Dto는 컨트롤러에서만 사용되어, 컨트롤러들과 같은 패키지안에 만든다고 했는데 Service에서도 사용된다?
1) validation을 체크하기에 좋다.
2) reflection하기에 좋다.
3) database에서 board와 user 테이블을 join해서 들고오면 Board(또는 User) Object(table) 하나로 join한 값을 다 받을 수 없다. 이런 경우 DTO를 사용해서 받아야 한다.
service를 만드는 과정에서,
회원가입 서비스를 만들때 파라미터를 dto로 받아야 한다.
서비스는 하나의 domain값만 건드리지 않는다. 여러가지 domain값을 같이 건든다.
서비스 기능을 구현할때, database관련 기능은 없고, 세션만 바꿔주는 '로그아웃'과 같은 기능은 서비스가 아닌 컨트롤러에서 구현하도록 한다. 서비스 파일에서는 request/response가 없어서 세션을 찾을 수 없다.
즉, request와 관련된 기능은 controller에서 다 처리하게 하고, service에서는 request로 다 처리된 결과만 가져와서 사용,처리하도록 해야 한다.
// 접근되는 주소: http://localhost:8080/blog/user
@WebServlet("/user")
public class UserController extends HttpServlet {
private static final long serialVersionUID = 1L;
public UserController() {
super();
}
// GET/POST 요청을 하면 doProcess 실행
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
// http://localhost:8080/blog/user?cmd = 머시기
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String cmd = request.getParameter("cmd");
// http://localhost:8080/blog/user?cmd=loginForm
if(cmd.equals("loginForm")) {
//서비스 호출
}else if(cmd.equals("login")) {
// 서비스 호출
}
}
}
// 접근되는 주소: http://localhost:8080/blog/board
@WebServlet("/board")
public class BoardController extends HttpServlet {
private static final long serialVersionUID = 1L;
public BoardController() {
super();
}
// GET/POST 요청을 하면 doProcess 실행
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
// 접근되는 주소: http://localhost:8080/blog/reply
@WebServlet("/reply")
public class ReplyController extends HttpServlet {
private static final long serialVersionUID = 1L;
public ReplyController() {
super();
}
// GET/POST 요청을 하면 doProcess 실행
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
private int id;
private String username;
private String password;
private String email;
private String address;
private String userRole; // admin, user -> 도메인이 있는거니까 enum으로 만드는게 더 좋음
private Timestamp createDate;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Board {
private int id;
private int userId;
private String title;
private String content;
private int readCount; // 조회수 , 디폴트값:0
private Timestamp createDate; // 작성한 날짜
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Reply {
private int id;
private int userId;
private int boardId;
private String content;
private Timestamp createDate;
}
@Data
public class JoinReqDto {
// 회원가입 요청시 필요한 데이터
private String username;
private String password;
private String email;
private String address;
//권한-> 회원가입하면 무조건 유저이다.
//시간 -> 현재시간 넣으면 된다.
}
@Data
public class LoginReqDto {
private String username;
private String password;
}
@Data
public class UpdateReqDto {
private String password;
private String email;
private String address;
}
public class UserService {
// 회원 가입, 회원 수정, 로그인, 로그아웃, 아이디중복체크
// 로그아웃은 세션 invalidate만 하면 된다. 로그아웃 함수안에서 세션을 찾을 수없다.-> request와 response가 없기 때문.
// 로그아웃은 DB관련 기능이 하나도 없다. 그냥 세션만 날리면 된다. 그래서 서비스로 만들지 않고 컨트롤러에서 처리한다. 왜냐하면 서비스에까지 request를 끌고 오면 안되기 때문이다. 컨트롤러가 request관련된 일을 다 하게해야 한다.
// 서비스에는 request로 다 처리된 결과만 가져와서 처리해야 한다.
// DB에 select가 아닌 insert 요청 (select인지 insert인지에 따라 응답형태가 달라진다.)
// select: 리턴하는값이 데이터, insert: 리턴하는 값이 성공 또는 실패를 의미하는 응답값
public int 회원가입(JoinReqDto dto) {
// 회원가입의 경우 insert 요청
return -1;
}
public User 로그인(LoginReqDto dto) {
//로그인은 select 요청 그리고 나서 세션 만들것
//로그인하고 select하고 그 행을 찾아 리턴할 것임
//select * from user where username = ? and password = ? >> * 들은 Model에 매핑이 된다.
//join하는 경우: select * from user inner join board where username = ? and password = ? >> * 들은 dto로 받아야 한다.
// 리턴한 값을 세션에 담을 것이다. 그래서 리턴값: User 오브젝트이다.
return null;
}
public int 회원수정(UpdateReqDto dto) {
// insert하는 기능
return -1;
}
public int 아이디중복체크(String username) {
//사용자로부터 아이디만 받으면 되서 dto를 만들 필요가 없다.
return -1;
}
}
public class BoardService {
}
public class ReplyService {
}