본문 바로가기
Spring

Spring Boot & Thymeleaf 토이 프로젝트 [Course Registration System]

by wadekang 2022. 4. 1.

Course Registration System 

Spring Boot와 Thymeleaf로 구현한 수강신청 웹 사이트 토이 프로젝트입니다. 개인 프로젝트로 진행했고, HTML 부분은 영한님의 스프링 강의에서 사용했던 HTML 코드를 수정하여 사용했습니다. 

 

Course Registration System Github
https://github.com/wadekang/course-registration-system
 

GitHub - wadekang/course-registration-system: Spring Boot 수강신청 웹 사이트 토이 프로젝트

Spring Boot 수강신청 웹 사이트 토이 프로젝트. Contribute to wadekang/course-registration-system development by creating an account on GitHub.

github.com


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!");

    ...
}

수강신청 내역


개인 프로젝트로 진행하기도 했고, 처음부터 너무 복잡한 시스템을 설계하면 완성도있게 구현하지 못하고 기능 구현하는데 급급할 것 같아 먼저 간단한 시스템을 토이 프로젝트로 진행해봤습니다. 

 

프로젝트를 진행하면서 스프링 부트 프로젝트의 프로젝트 진행 과정을 작게나마 느껴볼 수 있었고, 작은 시스템을 설계, 구현, 완성해 보면서 조금 더 큰 규모의 시스템을 구현해 볼 수 있겠다는 자신감을 얻게 되었습니다. 

 

 

댓글