[Spring Boot 게시판] 6일차

김정현·2022년 9월 30일
0

SPRINGBOOT게시판

목록 보기
22/36

1. 보고서 양식클래스 ResultData 구현, usr/article/getArticle에 ResultData 적용

  • 기존 Controller , Service , Repository에서는 실행후 각각 반환타입이 다르다.
  • 브라우저, 컨트롤러 ,서비스에서 응답하는 표준 보고서 양식을 만들고자 한다.
  • 성공, 실패 쉽게판단이 가능하고, 메세지와 성공여부, 그에따른 데이터를 나타내는 보고서를 만들고자한다.

1.ResultData클래스

public class ResultData {
	@Getter
	private String resultCode;
	@Getter
	private String msg;
	@Getter
	private Object data1;

	private ResultData() {

	}
	public static ResultData from(String resultCode,String msg) {
		return from(resultCode,msg,null);
	}
	public static ResultData from(String resultCode, String msg, Object data1) {
		ResultData rd = new ResultData();
		rd.resultCode = resultCode;
		rd.msg = msg;
		rd.data1 = data1;
		return rd;
	}

	public boolean isSuccess() {
		return resultCode.startsWith("S-");
	}

	public boolean isFail() {
		return isSuccess() == false;
	}

}
  • resultCode (성공여부 판단코드), msg(메세지), data1 (결과에따른 데이터)로 양식을 만듬
  • resultCode에는 성공시 "S-", 실패시 "F-" 가 들어갈 예정
  • isSuccess()는 resultCode가 S-로시작하면 성공한것 true
  • isFail()은 isSuccess()가 false이면 isFail()는 true이므로 실패를 의미
  • from()메서드는 매개변수를 2개받는것과 3개를받는것이 존재
  • 매개변수 2개를 받는 from()메서드는 실패결과에 따른 데이터는 존재하지 않으므로 data에는 null

2. usr/article/getArticle에 ResultData적용

	public ResultData getArticle(int id) {
		Article article = articleService.getArticle(id);
		if (article == null) {
		return ResultData.from("F-1", Ut.f("%d번 게시물은 존재하지 않습니다.", id));
		}
		return ResultData.from("S-1", Ut.f("%d번 게시물입니다.", id), article);
	}
  • articleService로부터 가져온 article의 존재유무에 따라 ResultData.from()메서드를 통해
  • ResultData객체로 결과를 반환

2. usr/article/doAdd에 ResultData적용

1. ArticleController.doAdd()

	@RequestMapping("usr/article/doAdd")
	@ResponseBody
	public ResultData doAdd(String title, String body) {
		if (Ut.empty(title)) {
			return ResultData.from("F-1", Ut.f("제목을 입력해 주세요."));
		}
		if (Ut.empty(body)) {
			return ResultData.from("F-1", Ut.f("내용을 입력해 주세요."));
		}
		ResultData writeRd = articleService.writeArticle(title, body);

		int id = (int) writeRd.getData1();
		Article article = articleService.getArticle(id);

		return ResultData.from(writeRd.getResultCode(), writeRd.getMsg(), article);
	}
  • 전에 만들었던 Ut.empty() 메소드를 통해 브라우저에서 요청시 전달받은 데이터( title와body )의 유무를 판단하고 그에대한 결과를 ResultData로 반환
  • ResultData writeRd는 articleService.writeArticle(title, body)실행후 반환한 ResultData이다.
  • articleService.writeArticle()메소드 실행후 반환된 ResultData객체(writeRd)에 data1은 작성된 게시물의 id가 들어있다
  • 브라우저에 작성된 게시물을 보여주기위해 writeRd의 id를 토대로 게시물을 찾고
  • 브라우저에 보고할 양식 ResultData에 resultCode, 메세지와 함께 담아서 반환한다.

2. ArticleService.writeArticle()

    public ResultData writeArticle(String title, String body) {	
            articleRepository.writeArticle(title, body);
            int id = articleRepository.getLastInsertId();	
   		 return ResultData.from("S-1", Ut.f("%d번 게시물이 생성되었습니다.", id), id);
    }
  • 게시물을 작성하고 작성된 게시물의 id를 ResultData에 담아서 반환

3. usr/article/getArticles에 ResultData적용

1. ArticleController.getArticles()

	@RequestMapping("usr/article/getArticles")
	@ResponseBody
	public ResultData getArticles() {		
		return articleService.getArticles();
	}
  • usr/article/getArticle와 usr/article/doAdd와 같이 ResultData를 적용
  • articleService.getArticles()을 리턴

2. ArticleService.getArticles()

   public ResultData getArticles() {
		List<Article> articles = articleRepository.getArticles();
		return ResultData.from("S-1", "Article List", articles);
	}
  • 게시물들을 ResultData에 담아서 반환

4. usr/member/doJoin에 ResultData 적용

1. MemberController.doJoin()

        @RequestMapping("usr/member/doJoin")
        @ResponseBody
        public ResultData doJoin(String loginId, String loginPw, String name, String nickname, String cellphoneNum,
                String email) {
            if (Ut.empty(loginId)) {
                return ResultData.from("F-1", "아이디를 입력 해주세요.");
            }
            if (Ut.empty(loginPw)) {
                return ResultData.from("F-2", "비밀번호를 입력 해주세요.");
            }
            if (Ut.empty(name)) {
                return ResultData.from("F-3", "이름을 입력 해주세요.");
            }
            if (Ut.empty(nickname)) {
                return ResultData.from("F-3", "닉네임 입력 해주세요.");
            }
            if (Ut.empty(cellphoneNum)) {
                return ResultData.from("F-4", "전화번호를 입력 해주세요.");
            }
            if (Ut.empty(email)) {
                return ResultData.from("F-5", "이메일을 입력 해주세요.");
            }
            ResultData joinRd = memberService.doJoin(loginId, loginPw, name, nickname, cellphoneNum, email);

            if (joinRd.isFail()) {
                return joinRd;
            }
            if (joinRd.isFail()) {
                return joinRd;
            }
            Member member = memberService.getMemberById((int) joinRd.getData1());
            return ResultData.newData(joinRd, member);
        }
  • 필수데이터(아이디,비밀번호 등등)들이 있는지확인하고 그에대한 결과를 ResultData로 반환
  • memberService.doJoin() 메소드의 실행 결과로 ResultData를 반환 받고
  • ResultData.isFail()은 실패여부를 나타내는 메소드로 회원가입이 실패했다면 joinRd에 isFail() 는 true가 되고 실패에따른 메세지도 포함되있다.
  • 만약 회원가입이 성공 했다면 ResultData로 결과를 반환해야한다.
  • 이때 가입이 성공한 회원정보도 결과로 반환 하기위해 Resultdata.from(joinRd.getResultCode(), joinRd.getMsg(), member) 를 사용해도되나
  • ResultData.newData(joinRd, member)를 통해 결과를 반환

2. MemberService.doJoin()

    public ResultData doJoin(String loginId, String loginPw, String name, String nickname, String cellphoneNum, String email) {
        // 로그인아이디 중복체크
        Member existsMember = getMemberByLoginId(loginId);
        if (existsMember != null) {
            return ResultData.from("F-6", Ut.f("중복되는 아이디(%s)가 있습니다", loginId));
        }
        // 이름과 이메일 중복체크
        existsMember = getMemberByNameAndEmail(name, email);
        if (existsMember != null) {
            return ResultData.from("F-7", Ut.f("중복되는 이름(%s)과 이메일(%s)이 있습니다", name, email));
        }
        memberRepository.doJoin(loginId, loginPw, name, nickname, cellphoneNum, email);
        int id = memberRepository.getLastInsertId();

        return ResultData.from("S-1", Ut.f("%s님 회원가입 성공", nickname),id);
    }
  • 아이디 중복체크 , 이름과 이메일 중복체크 후 결과를 ResultData로 반환
  • 회원가입 성공했다면 가입된 회원의 아이디를 포함하여 반환

3.ResultData클래스

  	  public static ResultData newData(ResultData Rd, Object data1) {

            return ResultData.from(Rd.getResultCode(),Rd.getMsg(),data1);
        }
  • newData 메소드는 ResultData타입과 Object타입을 매개변수로 받음
  • 내부적으로 from메소드에 인자로 ResultData Rd의 데이터들이 사용됨

5. ResultData 클래스에 제네릭 추가, usr/article/daAdd에 ResultData.newData() 적용

ResultData<Integer> joinRd = memberService.doJoin(loginId, loginPw, name, nickname, cellphoneNum, email);
  • memberService.doJoin() 는 ResultData타입을 반환한다

  • joinRd에는 ResultData<Integer>타입만 저장될수 있다.

  • memberService.doJoin()메소드의 리턴타입이 ResultData<Integer>아니고 ResultData(제네릭타입을 지정하지않은)이면 타입이 안전하지 않기 때문에

  • memberService.doJoin()메소드의 리턴타입이 ResultData<Integer>이 되어야한다.

  • 제네릭타입이 지정되지 않을시 Object로 타입이 지정

public static<DT> ResultData<DT> from(String resultCode, String msg, DT data1) {
		ResultData<DT>  rd = new ResultData<DT>();
		rd.resultCode = resultCode;
		rd.msg = msg;
		rd.data1 = data1;
		return rd;
	} 
  • from()메서드에서 제네릭을 사용하고있다.
  • 호출시 ResultData.<Integer>from(resultCode, msg, **Integer타입 객체** ) 으로 지정해줄수있지만
  • data1의 타입을 보고 컴파일러가 추측이가능해 ResultData.from(resultCode,msg, Integer타입 객체)로 <integer>생략가능

- 제네릭 메소드 설명 -

0개의 댓글