h2 DB 연동

최준호·2022년 1월 9일
0

eats

목록 보기
6/13
post-thumbnail

🔗 DB 연동

실제로는 mysql을 사용할 것이지만 우선 테스트와 테이블 구조를 짜기 전에 h2를 사용해서 테스트를 하려고 한다.

h2에 login으로 db를 만들고

그 이후에 다음과 같은 url로 접근이 가능해진다.

이제 project에서 설정을 하자

🔨 application.yml 설정

server:
  port: 8080

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/login-api
    driver-class-name: org.h2.Driver
    username: sa
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect
    hibernate:
      ddl-auto: create
    show-sql: true

logging:
  level:
    root: debug

test

repository와 service 만들기

  1. membeEntity 생성
@Entity
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table(name = "member")
public class MemberEntity implements UserDetails {

    @Id
    @GeneratedValue
    private Long idx;

    @Column(nullable = false, unique = true, length = 20)
    private String id;

    @Column(nullable = false, unique = true, length = 30)
    private String email;

    @Column(nullable = false, length = 20)
    private String pw;

    @Column(name = "auth")
    private String auth;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        Set<GrantedAuthority> roles = new HashSet<>();
        for(String role : auth.split(",")) roles.add(new SimpleGrantedAuthority(role));
        return roles;
    }

    @Override
    public String getPassword() {
        return this.pw;
    }

    @Override
    public String getUsername() {
        return this.id;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}
  1. LoginRepository 생성
@Repository
public class LoginRepository {

    @PersistenceContext
    private EntityManager em;

    public MemberEntity save(MemberEntity member){
        em.persist(member);
        return member;
    }
}
  1. LoginService 생성
public interface LoginService {
    public MemberVo join(MemberDto md);
}
  1. LoginServiceimpl 생성
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class LoginServiceImpl implements LoginService{
    private final LoginRepository loginRepository;

    @Transactional
    @Override
    public MemberVo join(MemberDto md){
        String id = md.getId();
        String pw = md.getPw();
        String rePw = md.getRePw();
        String email = md.getEmail();

        MemberEntity me = MemberEntity.builder().id(id).pw(pw).email(email).auth(MemberRoles.MEMBER.getRole()).build();

        MemberEntity save = loginRepository.save(me);

        return MemberVo.builder().id(save.getId()).build();
    }
}
  1. LoginController 생성
@RestController
@RequiredArgsConstructor
@RequestMapping("/v1")
public class LoginController {

    private final LoginService loginService;

    @PostMapping(value = "/join")
    public ResponseEntity join(@RequestBody MemberDto md){
        MemberVo join = loginService.join(md);

        CommonV1 result = CommonV1.builder()
                .code("200")
                .result("success")
                .msg("회원가입 성공")
                .data(join)
                .build();

        return ResponseEntity.status(HttpStatus.OK).body(result);
    }
}
  1. postman으로 테스트

테스트

확인

실제 데이터가 들어간 것으로 정상적으로 h2 db와 연결되어 있는 것을 확인할 수 있었다.

👍 DB연동과 회원가입 로직을 만들며 느낀점

  1. DB연동은 크게 어려운 점은 없었다.
  2. 회원가입 로직을 만들며 Dto, Vo, Entity를 사용하는 용도를 파악할 수 있었다.
  3. 회원의 권한은 list형식으로 만들어야하는데 우선은 split으로 적용해놨고 다음 작업때는 다른 테이블로 빼서 작업하는 것이 좋겠다.
  4. Transaction의 설정과 적용 범위를 항상 생각하며 서비스 로직을 짜자!

다음 시간에는 테스트로만 만든 회원가입 로직을 정말 회원가입에 사용할 수 있도록 수정하고 테스트 코드와 api 문서 작업까지 진행해보자!

profile
해당 주소로 이전하였습니다. 감사합니다. https://ililil9482.tistory.com

1개의 댓글

comment-user-thumbnail
2023년 1월 20일

제가 조금 헷갈려서 그러는데 질문 하나만 드려도 될까요?
@Transactional(readOnly = true)를 하면 성능은 향상되지만 CRUD에서 R만 사용할 수 있다고 알고있는데,
회원가입은 Insert인거 같은데 readOnly true를 쓰면 안되는 것 아닌가요??

답글 달기