Postman API Test
준비 사항
- Postman Workspaces API 설계(API 명세서 작성)
- Spring web server-client 파일(intellij 사용)
순서
- Workspaces에 Collections 생성 - 이름 설정(프로젝트 이름)
- 구현 기능 별 API 설계(Add request)
- HTTP 메서드 타입 결정, Rquest 이름 - 구현 기능, API 주소 입력
- API 주소(또는 엔드 포인트) 입력
- Input data 있을 경우 변수 명과 입력 값 설정
- request save
- API 기능 구현 후 테스트 실시
- API주소 및 데이터 변경 사항 있을 시 Postman에 반영
- input 있을 경우 입력 후 send(Ctrl+enter)
- Response, Server log 확인 및 문제 있을 경우 해당하는 코드 수정
코드 수정 시 확인할 부분
Controller - 클라이언트
//도서관 회원가입 기능(회원 등록)
@PostMapping("/user/signup")
public String signup(@RequestBody @Valid SignupRequestDto requestDto, BindingResult bindingResult) {
// Validation 예외처리
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
if (fieldErrors.size() > 0) {
for (FieldError fieldError : bindingResult.getFieldErrors()) {
log.error(fieldError.getField() + " 필드 : " + fieldError.getDefaultMessage());
}
return "redirect:/api/user/signup";
}
userService.signup(requestDto);
return "redirect:/api/user/login-page";
}
// 회원 관련 정보 받기
@GetMapping("/user/{id}")
@ResponseBody
public UserInfoDto getUserInfo(@AuthenticationPrincipal UserDetailsImpl userDetails, @PathVariable Long id) {
// 현재 인증된 사용자의 ID를 사용해 사용자 정보 조회
return userService.getUserInfo(id, userDetails);
}
Service - 비즈니스 로직
// 회원 가입 기능
public void signup(SignupRequestDto requestDto) {
// 비밀번호 암호화
String password = passwordEncoder.encode(requestDto.getPassword());
// 주민번호 중복 확인
String idNumber = requestDto.getIdNumber();
Optional<User> checkIdNumber = userRepository.findByIdNumber(idNumber);
if (checkIdNumber.isPresent()) {
throw new IllegalArgumentException("중복된 주민번호가 존재합니다.");
}
// 전화 번호 중복 확인
String phoneNumber = requestDto.getPhoneNumber();
Optional<User> checkPhoneNumber = userRepository.findByPhoneNumber(phoneNumber);
if (checkPhoneNumber.isPresent()) {
throw new IllegalArgumentException("중복된 Email 입니다.");
}
// 사용자 ROLE 확인
UserRoleEnum role = UserRoleEnum.USER;
if (requestDto.isAdmin()) {
if (!ADMIN_TOKEN.equals(requestDto.getAdminToken())) {
throw new IllegalArgumentException("관리자 암호가 틀려 등록이 불가능합니다.");
}
role = UserRoleEnum.ADMIN;
}
// 사용자 등록
User user = new User(requestDto, password, role);
userRepository.save(user);
}
public UserInfoDto getUserInfo(Long id, UserDetailsImpl userDetails) {
// 회원여부 확인
User user = userRepository.findById(userDetails.getUser().getUser_id())
.orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다."));
if (user.getUser_id() == id) {
// 회원 아이디 기준으로 회원 정보 가져오기
return UserInfoDto.builder()
.name(user.getName())
.sex(user.getSex())
.phoneNumber(user.getPhoneNumber())
.address(user.getAddress())
.isAdmin(user.getRole() == UserRoleEnum.ADMIN)
.build();
} else {
System.out.println("다른 유저의 정보는 확인할 수 없습니다.");
return UserInfoDto.builder().build(); // 빈 빌더로 기본값을 가진 객체를 생성
}
}
Entity - DB와 객체 매핑(DB와 데이터 확인)
@Entity
@Getter
@NoArgsConstructor
@Table(name = "user")
public class User {
// 회원 정보
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long user_id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String password;
@Column(nullable = false, unique = true)
private String idNumber;
@Column(nullable = false)
private String sex;
@Column(nullable = false, unique = true)
private String phoneNumber;
@Column(nullable = false)
private String address;
@Enumerated(value = EnumType.STRING)
private UserRoleEnum role;
public User(SignupRequestDto requestDto, String password, UserRoleEnum role) {
this.name = requestDto.getName();
this.sex = requestDto.getSex();
this.idNumber = requestDto.getIdNumber();
this.phoneNumber = requestDto.getPhoneNumber();
this.address = requestDto.getAddress();
this.password = password;
this.role = role;
}
}
Dto - 데이터 전송 객체(서버 및 클라이언트 간 데이터 교환)
@Getter
@Setter
public class SignupRequestDto {
@NotBlank
private String name;
@NotBlank
private String password;
@NotBlank
private String sex;
@NotBlank
private String idNumber;
@NotBlank
private String address;
@NotBlank
private String phoneNumber;
private UserRoleEnum role;
private boolean admin = false;
private String adminToken = "";
}
사용자 인증 정보가 필요한 경우
- Postman의 API 주소를 로그인 엔드 포인트로 설정 후 로그인 정보를 입력(아이디, 비밀번호) 후 send로 데이터를 보낸다
- Response 탭에서 Header의 Jwt token 또는 cookies 데이터를 사용한다.
- Jwt 토큰 사용 시 Authorization 탭에서 Type - Bearer Token 선택 후 Token 창에 복사한 Jwt token 값을 붙여 넣어 사용한다.
- 테스트가 끝난 API는 결과 샘플을 저장 후 Document에 사용할 수 있음
Intellij Git Control
Intellij Git 명령어
인텔리제이에서 Terminal을 열어서 Git 명령어를 직접 입력하거나 메뉴에서 선택할 수 있음
터미널에 입력
기본 명령어
- git status : 현재 상태 확인
- git log : 전체 로그 확인
- git init : git 저장소 생성하기
- git clone : 저장소 복제 및 다운로드
- git add , git add* : 저장소에 코드 추가
- git add - A : 커밋에 파일의 변경 사항을 한 번에 모두 포함
- git commit -m "message" : 커밋 생성
- git push origin master : 변경 사항 원격 서버 업로드(push)
- git pull : 원격 저장소의 변경 내용을 현재 디렉토리로 가져오기(pull)
- git diff branch name branch name2 : 변경 내용을 merge하기 전에 바뀐 내용 비교
Git Branch 관련
- git init : git init을 설정하면 해당 폴더에 .git 이라는 파일이 생성됨
- git remote add origin github 주소 : github 주소와 연결
- git branch 브랜치명 : 브랜치 생성
- git checkout 브랜치명 : 해당 브랜치로 이동
- git branch -b 브랜치명 : 브랜치를 생성하고 해당 브랜치로 바로 이동
- git branch : 원하는 브랜치로 이동했는지 확인
- git brach -a : 모든 브랜치 확인
- git add . : 파일 및 폴더 add
- git commit -m "commit message" : 커밋
- git push origin 브랜치명 : 원하는 브랜치로 push하여 원격 서버에 전송
- git branch -d 브랜치 이름 : 브랜치 삭제
- git merge 다른 브랜치 이름 : 현재 브랜치에 다른 브랜치 수정사항 병합
Git Config 설정 관련
- git config --list : 전체 config 리스트 확인
- git config --global user.email "name@naver.com" : git config 설정하는 방법
- git config --unset user.email : git config 삭제하기
- git config --unset --global user.email : global로 설정된 사용자를 지울 경우 global 추가
인텔리제이 메뉴창
- Commit & Push 메뉴창
- Branch & Commit log 관련 메뉴창
- 상단 Git 메뉴
인텔리제이 git conflict 해결
- 깃 merge 명령어 입력 후 conflict 발생 시 인텔리제이 상단 Git 메뉴 클릭 → Resolve Conflicts 선택
- 추가 창에서 충돌 발생한 파일을 더블 클릭해서 수정 가능
- 새로 창이 뜨면 충돌이 일어난 부분을 수정할 수 있는데 왼쪽이 현재 코드 오른쪽이 다른 브랜치로부터 받아온 코드임
- 화살표를 누르면 코드가 반영되고 x를 누르면 무시할 수 있음(코드 선택적 병합 가능) 코드 병합 완료 후 Apply를 누르면 conflict를 해결할 수 있음
'항해 99' 카테고리의 다른 글
WIL-7 (0) | 2024.03.24 |
---|---|
WIL-6 (0) | 2024.03.17 |
WIL-5 (0) | 2024.03.10 |
Git Commit Convension, gitignore, application.properties 암호화 (0) | 2024.02.23 |
항해 99 WIL - 0주차 (0) | 2024.02.04 |