첫 협동 프로젝트_02

Kingyj·2025년 1월 20일

개요

  • 여러 종류의 웹 서비스 중, 기본적인 비즈니스 웹 서비스인 상품을 판매하는 웹 서비스를 제작.
  • 모두 백엔드로 이루어진 팀.

서비스

  • 커피원두를 판매하는 웹 서비스

정리 내용

  • 초기 세팅(서버)
  • 스프링 시큐리티 (회원가입 / 로그인)
  • 트러블 이슈 / 해결

초기 세팅(서버)

Main 리포지터리를 Fork하게되면,
최상의 폴더 NBE3-4-1-15Team가 생성된다.

그 안의 Backend폴더를 최상의폴더로 열어준다.

도커를 실행하여 MySQL (DB) 서버를 열어준다.

터미널을 열어준다.
*비밀번호는 MySQL 생성시 설정한 비밀번호 !!

docker exec -it (본인도커파일명) mysql -uroot -p
비밀번호 (따로 표기안되며 입력 후 엔터)
show databases;
create database tmp;

오류없이 위 과정이 완료되면 IDE로 돌아온다.
static의 application.yml를 열어준다.

url : jdbc:mysql://localhost:3306/tmp
username : root
password : MySQL비밀번호 (lldj123414)

테스트 할 땐, 24번줄의 ddl-auto : creat-drop

세팅 후 브라우저를 열고
localhost:8080 를 열어준다.

test 페이지가 뜨고 초기 세팅 완료.


스프링 시큐리티 (회원가입 / 로그인)

본인이 맡은 파트는 스프링 시큐리티중에서도 회원가입과 최초 시큐리티 설정이다.

구현에 앞서 우리가 정한 회원가입 조건은
1. 이메일과 비밀번호로 로그인한다.
2. 중복이메일 가입 방지

@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Member extends BaseTime {
    @Column(nullable = false)
    private String email;

    private String password;

    @Column(unique = true)
    private String refreshToken;

    private String nickname;

    private String address;

    private String postCode; // 우편번호
    

필수 입력값으로 이메일과 비밀번호를 설정하고
별명, 주소, 우편번호를 추가로 입력하게 하였다.

public Member registerUser(String email, String rawPassword) {
      userRepository.findByEmail(email)
              .orElseThrow(() -> new IllegalArgumentException("이미 사용 중인 이메일입니다."));
    
      String encryptedPassword = passwordEncoder.encode(rawPassword);

중복 이메일 가입 방지와 비밀번호 암호화 저장작업.

 @PostMapping("/created/members")
   public ResponseEntity<String> register(@RequestParam String email, @RequestParam String password) {
       try {
           userService.registerUser(email, password);
           return ResponseEntity.ok("회원가입이 완료되었습니다.");
       } catch (IllegalArgumentException e) {
           return ResponseEntity.badRequest().body(e.getMessage());
       }
   }

정상적으로 회원가입 완료 시, 알림 설정.

코드 입력보다는 각 파일간의 상호작용 그리고 로직을 이해하는데 시간이 오래걸렸다.
또한, 어노테이션이 뭔지는 알아도 그 어노테이션의 사용법을 익히기 위해 많은 시간을 사용했다.


트러블 이슈 / 해결

1. Git Push 이슈 / 해결

이번 프로젝트는 Main 리포지터리를 만들고
팀원 각자의 리포지터리에 Fork하여 진행상황을 올리고
최종적으로 Main에 Pull하는 방식이다.

Push를 하자, (non-fast-forward)라는 오류 표기.

찾아보니 내브런치보다 커밋된 브런치가 앞서있다고한다.
쉽게 말해 내가 지금 push하려는 리포지터리가, 내가 작성하고 있는 파일보다 더 최신화가 되어있다는 뜻으로 이해했다.

고로 Main리포티저리에서 최신업데이트를 fork해주고
IDE의 git에서 최신 업데이트와 pull marge를 해주었다.

그리고 다시 시도하자 성공.
(사실 이런 저런 시도를 하며 1시간 가량 소비했다.)

2. 충돌 이슈 / 해결

본인이 작성한 코드가 오류없이 실행되나 테스트를 하려고 실행을 하면 오류메세지와 함께 실행이 중지됬다.
오류 메세지를 읽어보니 본인이 작성한 코드와 무관한 Order폴더쪽 오류로 실행이 멈추는것을 확인했다.
해당 파트 팀원과 얘기해보니,
push과정에서 아직 완성되지 않은 코드가 함께 pull되었고
그 코드가 Order폴더에 포함된 코드였다.

결론적으로 수정된 Order 코드를 새로 업데이트받아 실행하니 정상 실행되었다.

빠른 소통으로 빠르게 해결.

3. 어노테이션 활용 능욕 부족 / 해결

스프링부트에 익숙하지않다보니, 어노테이션 활용에 크고 작은 어려움이 있다. 대표적으로 최초에 본인이 작성한 코드가 정상 실행되었지만, 팀원들에게 코드 리뷰를 요청하였다.

요청 이유 : 본인이 작성한 코드의 평가와 더 좋은 코드가 있다면 의견을 받기위해서이다.

본인은 모든 생성자를 직접 작성하였고,
@RequiredArgsConstructor 라는 어노테이션으로
생성자를 자동 생성 가능하다는것을 배웠다.
(기존에 배웠지만 활용하지 못했다..)

@RequiredArgsConstructor는 Lombok 라이브러리에서 제공하는 어노테이션으로, 클래스의 final 필드와 @NonNull 필드를 초기화하는 생성자를 자동으로 생성해 줍니다.

본인이 작성만 많은 생성자로 길게 늘어진 코드가 저 어노테이션하나로 깔끔하게 정리됬다.


회고

사실 처음 시큐리티쪽을 하겠다고 자신있게 말해놓고
막상 구현하려니 막막해서 고민이 많았다.
정말 진지하게 의욕이 앞선거같다고 말하려고도 생각했으나,
그 전에 할 수 있는 모든 방법을 동원해보고자 했다.
관련 강의를 속성으로 하루종일 시청하고
강의에서 나오는 코드를 클론하고 gpt에게 코드 해설과
로직의 설명을 부탁했다.

그렇게 조금식 코드를 작성하다보니 처음의 고민이 무색하게
생각보다 빠른 속도로 진행되었고 최종적으로 코드리뷰를 통해 OK 사인을 받을때 쾌감은 짜릿했다!.


0개의 댓글