프로젝트 전체구조 잡기

jungnoeun·2022년 7월 13일
0

jsp

목록 보기
3/14

프로젝트는 크게 3가지로 나눌 수 있다.
이는 model, controller, service이다.

<요청하는 입장>

controller

일단 앞으로 만들 게시판에서 사용할 database의 테이블은 3개이므로 필요한 front-controller도 3개가 필요하다.

  • front-controller 1개가 모든 domain(user, board, reply)를 다 처리하게 하면 너무 복잡해지기때문에 컨트롤러를 모델(user, board, reply)별로 나누어야 한다.

controller 형식

  • 서블릿 파일로 controller를 만든다.
    이유: xml 파일을 건드리지 않아도 되기 때문이다. 대신 어노테이션을 사용한다.





Model

Service를 구현할때 각 기능함수마다 필요한 파라미터가 다를 수 있다.

  • 예) 회원가입에 필요한 파라미터정보: username,password,email,address
    로그인에 필요한 파라미터정보: username, password

이렇게 다양한 정보들을 파라미터로 다 써서 주는 것이 아니라 object를 만들어 사용하는 것이 좋다.
-> Model을 생성한다.

Model의 용도

  • 응답하는 경우,
    database와 구성을 똑같이 만들어두고, database에서 값을 받을때 database값을 담을 object 역할을 한다.
  • 요청받을 때에는,
    Model이 아니라 data를 dto에 담아서 사용한다.

    알아보고 싶은 것 (1)
    Model과 DTO의 차이점

알아보고 싶은 것 (2)
Model을 만들때 롬복 어노테이션 4개가 사용되는데 이 어노테이션의 의미
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder

알아보고 싶은 것 (3)
Dto는 컨트롤러에서만 사용되어, 컨트롤러들과 같은 패키지안에 만든다고 했는데 Service에서도 사용된다?

DTO를 만드는 이유

1) validation을 체크하기에 좋다.
2) reflection하기에 좋다.
3) database에서 board와 user 테이블을 join해서 들고오면 Board(또는 User) Object(table) 하나로 join한 값을 다 받을 수 없다. 이런 경우 DTO를 사용해서 받아야 한다.






Service

service를 만드는 과정에서,
회원가입 서비스를 만들때 파라미터를 dto로 받아야 한다.

  • Model로 파라미터를 받으면 null값 체크가 안되고, 값을 정확히 받을 수 없다.

Service 구현 방법

  • 파라미터: Dto 구현&사용
  • 리턴 값: 해당 서비스 기능에 따라 달라진다. select 요청이면 리턴값을 데이터로 하고, insert 요청이면 리턴값을 성공(1) 또는 실패(-1)를 의미하는 값으로 한다.

서비스는 하나의 domain값만 건드리지 않는다. 여러가지 domain값을 같이 건든다.

  • 예) 게시물 상세보기를 하면 board, user, reply 테이블을 다 필요로 하여 건드린다.
    그래서 user, board, reply 별로 model과 dto를 나눌때 Service는 따로 나누지 않는다.

database값이 필요없는 기능의 구현

서비스 기능을 구현할때, database관련 기능은 없고, 세션만 바꿔주는 '로그아웃'과 같은 기능은 서비스가 아닌 컨트롤러에서 구현하도록 한다. 서비스 파일에서는 request/response가 없어서 세션을 찾을 수 없다.
즉, request와 관련된 기능은 controller에서 다 처리하게 하고, service에서는 request로 다 처리된 결과만 가져와서 사용,처리하도록 해야 한다.






Config 패키지

  • 설정정보를 담는다.
  • database관련된 설정도 여기서 한다.






소스 코드

controller 코드

UserController 코드

// 접근되는 주소: 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")) {
			// 서비스 호출
		}
	 }
}

BoardController 코드

// 접근되는 주소: 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 {

	}
}

ReplyController 코드


// 접근되는 주소: 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 {

	}
}






Model 코드

User 코드

@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;
	
}

Board 코드

@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; // 작성한 날짜
	
	
}

Reply 코드

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Reply {
	private int id;
	private int userId;
	private int boardId;
	private String content;
	private Timestamp createDate;
	
	
}

JoinReqDto 코드

@Data
public class JoinReqDto {
	// 회원가입 요청시 필요한 데이터
	private String username;
	private String password;
	private String email;
	private String address;
	//권한-> 회원가입하면 무조건 유저이다.
	//시간 -> 현재시간 넣으면 된다.
}

LoginReqDto 코드

@Data
public class LoginReqDto {
	private String username;
	private String password;
}

UpdateReqDto 코드

@Data
public class UpdateReqDto {
	private String password;
	private String email;
	private String address;
	
}






Service 코드

UserService 코드

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;
	}
	
	
}

BoardService 코드

public class BoardService {

}

ReplyService 코드

public class ReplyService {

}
profile
개발자

0개의 댓글