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 클래스, 메일 서비스 구현
- Application Service(애플리케이션 서비스)
구현하기 전에
- 테스트 케이스 정의
- 이미 존재하는 사용자 명/이메일 주소는 등록 불가
- 비밀번호 암호화
- 저장소에 사용자 저장
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가 커넥션 풀뿐만 아니라 데이터소스 인스턴스와 엔티티매니저 인터페이스를 생성하고, 이를 기반으로 메소드 구현
절차
- Test case 시나리오 작성
- pom.xml에 h2 의존성 추가
- h2가 참고하는 src/test/resources 디렉터리에 .properties 파일 생성(MySQL은 src/main/resources/application.properties 참고한다.)
- 구현
※ @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";
}
}
실행 화면
성공!!
회원가입 실패 -> sql에 table을 만들지 않았다.
에러 발생 : 참고 zena1010.tistory.com/14
다음 페이지 : zena1010.tistory.com/13
'개발 관련 > TaskAgile' 카테고리의 다른 글
[TaskAgile] DB table/column 추가 (0) | 2021.01.06 |
---|---|
[TaskAgile] 03. 스프링 시큐리티 - 02. 이메일 보내기 (0) | 2020.11.30 |