Course Registration System
Spring Boot와 Thymeleaf로 구현한 수강신청 웹 사이트 토이 프로젝트입니다. 개인 프로젝트로 진행했고, HTML 부분은 영한님의 스프링 강의에서 사용했던 HTML 코드를 수정하여 사용했습니다.
Course Registration System Github
https://github.com/wadekang/course-registration-system
Tools
- Java: JDK 11.0.13
- Spring Boot 2.6.4
- Gradle
- DB: H2 1.4.200 & MariaDB(AWS RDS) 10.5.13
- Cloud: AWS EC2
- CI/CD: TravisCI, AWS S3, AWS CodeDeploy
ERD
- MAJOR : 전공 정보
- USER : 사용자 정보
- COURSE : 수업 정보
- CLASSES : 수업의 분반 정보
- TAKE_CLASS : USER가 수강하고 있는 수업들 확인하기 위한 테이블 (or 해당 수업을 수강하는 USER들), USER와 CLASSES가 다대다 관계가 되기 때문에 테이블 생성
Main Page
회원 가입
위의 폼에 정보를 입력받아 회원 가입을 진행, 만약 이미 존재하는 로그인 ID이거나 비밀번호와 비밀번호 확인이 다를 경우 경고 메세지 출력 (html alert)
@Transactional
public Long join(UserSignUpDto signUpDto) {
userRepository.findByLoginId(signUpDto.getLoginId())
.ifPresent(user -> {
throw new IllegalArgumentException("Failed: Already Exist ID!");
});
if (!signUpDto.getPassword().equals(signUpDto.getPasswordConfirm())) {
throw new IllegalArgumentException("Failed: Please Check Password!");
}
...
}
로그인 & 로그아웃
Spring Security를 적용하여 로그인하지 않은 유저라면 수강 조회, 수강 신청, 수강신청 내역 버튼을 눌렀을 때 로그인 화면으로 이동
@RequiredArgsConstructor
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final UserDetailsServiceImpl userDetailsService;
private final AuthSuccessHandler authSuccessHandler;
private final AuthFailureHandler authFailureHandler;
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/", "/home", "/login/**", "/css/**", "/signup/**").permitAll()
.anyRequest()
.authenticated()
.and()
.formLogin()
.usernameParameter("loginId")
.passwordParameter("password")
.loginPage("/login")
.loginProcessingUrl("/login/action")
.successHandler(authSuccessHandler)
.failureHandler(authFailureHandler)
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/home")
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID").permitAll()
.and()
.sessionManagement()
.maximumSessions(1)
.maxSessionsPreventsLogin(false)
.expiredUrl("/login?error=true&exception=Session Expired!");
}
}
수강 조회
전공별 수강 조회 기능
과목별 분반 조회
수강 신청
첫 번째 셀렉트 박스에서 전공을 선택하면 두 번째 셀렉트 박스에 해당 전공 과목들 조회 가능
수강 신청시 정원이 가득 찼거나 이미 신청한 과목인 경우 신청되지 않고 경고 메세지 출력
@Transactional
public Long save(Long userId, Long classId) {
User user = userRepository.findById(userId).get();
Classes classes = classesRepository.findById(classId).get();
if (classes.isFull()) throw new IllegalArgumentException("Failed: Full");
Optional<TakeClass> any = user.getTakeClasses().stream()
.filter(takeClass ->
takeClass.getClasses().getCourse().getCourseId()
.equals(classes.getCourse().getCourseId())).findAny();
if (any.isPresent()) throw new IllegalArgumentException("Failed: Already Registered!");
...
}
수강신청 내역
개인 프로젝트로 진행하기도 했고, 처음부터 너무 복잡한 시스템을 설계하면 완성도있게 구현하지 못하고 기능 구현하는데 급급할 것 같아 먼저 간단한 시스템을 토이 프로젝트로 진행해봤습니다.
프로젝트를 진행하면서 스프링 부트 프로젝트의 프로젝트 진행 과정을 작게나마 느껴볼 수 있었고, 작은 시스템을 설계, 구현, 완성해 보면서 조금 더 큰 규모의 시스템을 구현해 볼 수 있겠다는 자신감을 얻게 되었습니다.
'Spring' 카테고리의 다른 글
Spring @RestControllerAdvice 적용 (0) | 2023.11.09 |
---|---|
Spring Validation 특정 String만 받도록 검증 하기 (0) | 2023.11.09 |
Spring JUnit5 Sql script로 테스트 데이터 불러오기 (0) | 2022.03.17 |
[Spring][Error] Spring Security 적용할 때 circular reference, dependency가 cycle 형성하는 것 해결하기 (2) | 2022.03.14 |
AWS RDS(MariaDB)와 IntelliJ Database 연동하기 - [스프링 부트와 AWS로 혼자 구현하는 웹 서비스] (0) | 2022.03.05 |
댓글