[TaskAgile] 02. 회원가입 구현

2020. 11. 26. 00:42개발 관련/TaskAgile

회원가입

 

 

※서드 파티 라이브러리 : 제 3자 라이브러리. 효율적인 개발을 위해, plugin, library, framework를 사용하는데, 이것들처럼 제 3자로써 중간다리 역할을 하는 것을 3rd party라고 한다.

 

error  Strings must use singlequote  quotes

-> script 안에서는 "대신 '를 쓸 것!

 


등록 컨트롤러 테스트

 

 

 

 

 


도메인 모델로 회원가입 구현

 

※ @Service 어노테이션 : 해당 클래스를 활용하는 client를 위한 연산을 제공하는 클래스에 적용

※ @Column 어노테이션 : hbm2dd1 기능(하이버네이트) 사용할 때 이 것을 사용

 

  • 도메인 주도 설계
    • Application Service(애플리케이션 서비스)
      • 모델의 작업만 조정
      • 트랜젝션을 통제(@Transactional 어노테이션) 사용
      • 때로는 client가 도메인에 접근하려 할 때 막는다.
      • 도메인 서비스에 의존
      • Ex) UserServiceImpl 클래스 
    • Domain Service(도메인 서비스)
      • 도메인 객체에 어울리지 못하는 비즈니스 로직(주로 일반적인 CRUD가 아닌 연산)을 캡슐화
      • Ex) RegistrationManagement 클래스
    • Infrastructure Service(인프라 서비스)
      • 외부 리소스(DB, msg Queue,  cach server, 서드 파티 RESTful API) 활용
      • Ex) UserRepository 클래스, 메일 서비스 구현

 

 

 


구현하기 전에

  1. 테스트 케이스 정의
    • 이미 존재하는 사용자 명/이메일 주소는 등록 불가
    • 비밀번호 암호화
    • 저장소에 사용자 저장

 


UserRepository 구현하기 -> Hibernate 활용

 

  • JPA
    • 사용자가 repository의 인터페이스만 작성하면 spring data JPA가 자동으로 구현체를 생성해준다.
    • 페이지네이션(pagination) 지원 : 별도의 설치 없이 바로 활용할 수 있다.
    • @Query 어노테이션 적용 : 커스텀 쿼리 , 네이티브 쿼리
      •  + : 구현체의 자동 생성, 솔루션 제공, 단위 테스트 신경 덜씀
      •  -  : 인터페이스 깔끔하지 못함, 다른 구현체로의 전환이 자유롭지 못함
// JPA 적용한 인터페이스 작성
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
	User findByUsername(String username);
    User findByEmailAddress(String emailAddress);
    
    
    // 날짜 사이에 등록한 사용자 찾기
    List<User> findByCreatedDateBetween(Date, Date);

    // 성으로 사용자를 찾고 이름을 기준으로 내림차순으로 정렬해주는 메소드 선언
    List<User> findByLastNameOrderByFisrstNameDesc(String lastName);
}

 

/*	@Query 어노테이션을 메소드에 적용	*/
// 커스텀 쿼리
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);

// 네이티브 쿼리
@Query(value = "SELECT * FROM USERES WHERE EMAIL_ADDRESS + ?1", nativeQuery = true)
User findByEmailAddress(String emailAddress);

 


TaskAgile에서는 Repository 인터페이스를 깔끔하게 유지하고 싶기 때문에 스프링 데이터 JPA를 활용하지 않을 것이다.

 

목적

  • UserRepository 인터페이스 유지하기
  • HibernateUserREpository 구현을 infrastructure.repository 패키지에 만들기
  • 스프링 데이터 JPA가 커넥션 풀뿐만 아니라 데이터소스 인스턴스와 엔티티매니저 인터페이스를 생성하고, 이를 기반으로 메소드 구현

 

절차

  1. Test case 시나리오 작성
  2. pom.xml에 h2 의존성 추가
  3. h2가 참고하는 src/test/resources 디렉터리에 .properties 파일 생성(MySQL은 src/main/resources/application.properties 참고한다.)
  4. 구현

 

※ @DataJpaTest 어노테이션 : JPA 컴포넌트를 테스트하기 위한 용도, 임베디드 인 메모리 DB(H2)를 활용. spring이 자동으로 repository의 구현체를 생성한 다음 인스턴스화한다.

@ActiveProfiles 어노테이션 : 

@SpringBootTest 어노테이션 : 일반적인 spring boot 기반의 test class에 붙인다. 속성을 추가해서 application에 따라 설정을 다르게 할 수도 있다.

 

@Runwith(SpringJunit4ClassRunner.class) Junit lib의 @Runwith는 Junit 내장 runner 대신 해당 클래스를 참조, 테스트 실행. spring test context framework의 모든 기능을 제공한다. BlockJunit4ClassRunner을 커스터마이징 했다.
@Runwith(SpringRunner) SpringJunit4ClassRunner를 상속한 클래스, 사실상 이름만 짧게 줄인 클래스이다.
@SpringbootTest 일반적인 spring boot 기반의 test class에 붙인다. 속성을 추가해서 application에 따라 설정을 다르게 할 수도 있다.

 

스프링 부트 테스트 : cornswrold.tistory.com/338


에러 발생 : zena1010.tistory.com/12

 

$ mvn clean install

위의 명령어 입력한 결과 build success 했지만 shutdown되어서 찜찜하다...

 

 

실행 결과

[INFO] Stopping application...
2020-11-26 22:37:51.804  INFO 27508 --- [           main] inMXBeanRegistrar$SpringApplicationAdmin 
	: Application shutdown requested.
2020-11-26 22:37:51.805  INFO 27508 --- [           main] ConfigServletWebServerApplicationContext 
	: Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@586643d1: 
	startup date [Thu Nov 26 22:37:25 KST 2020]; root of context hierarchy
2020-11-26 22:37:51.808  INFO 27508 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        
	: Unregistering JMX-exposed beans on shutdown
2020-11-26 22:37:51.809  INFO 27508 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        
	: Unregistering JMX-exposed beans
2020-11-26 22:37:51.809  INFO 27508 --- [           main] j.LocalContainerEntityManagerFactoryBean 
	: Closing JPA EntityManagerFactory for persistence unit 'default'
2020-11-26 22:37:51.811  WARN 27508 --- [           main] o.s.b.f.support.DisposableBeanAdapter    
	: Invocation of destroy method failed on bean with name 'inMemoryDatabaseShutdownExecutor': java.lang.IllegalStateException: Cannot load driver class: com.mysql.jdbc.Driver
2020-11-26 22:37:51.812  INFO 27508 --- [           main] com.zaxxer.hikari.HikariDataSource       
	: HikariPool-1 - Shutdown initiated...
2020-11-26 22:37:51.820  INFO 27508 --- [           main] com.zaxxer.hikari.HikariDataSource       
	: HikariPool-1 - Shutdown completed.

 

명령어 실행

$ mvn spring-boot:run

 

localhost:8080/register 페이지를 열면 404에러 페이지.

 

Controller에 매핑하지 않았다.

 

 

경로 추가("/register")

@Controller
public class MainController {

  @GetMapping(value = { "/", "/login", "/register" })
  public String entry() {
    return "index";
  }

}

 

실행 화면

localhost:8080/register을 켰을 때

 

성공!!

 

 

회원가입 실패 -> sql에 table을 만들지 않았다.

회원가입 실패

에러 발생 : 참고 zena1010.tistory.com/14

 

 

 

 

다음 페이지 : zena1010.tistory.com/13