본문 바로가기
  • 실행력이 모든걸 결정한다
개발 프로젝트/[팀] Web - SQL 교육 사이트

[팀 프로젝트] SQL 교육 사이트 - 20220912 안내 사항

by 김코더 김주역 2022. 9. 12.
반응형

1. 프로젝트 코드 변경 사항

- 애플리케이션을 실행시키면 샘플 데이터들을 모두 DB에 반영하도록 Listener을 추가했다. 애플리케이션이 실행되고 애플리케이션 컨텍스트가 생성된 직후에 onApplicationEvent()가 호출된다.

@Component
public class AppStartedListener implements ApplicationListener<ApplicationStartedEvent> {

    @Autowired
    SaveDBService saveDBService;

    // 애플리케이션이 시작되고 ApplicationContext가 생성되고 난 후에 실행되는 리스너 메소드
    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        saveDBService.saveAllSampleData();
    }
}

- 이에 따라 HomeController의 home() 메소드를 삭제했다.

 

 

 

2. 팀장 강의 내용

1) Listener

(1) 개념 설명

- 특정 이벤트가 발생하기를 기다리다가 자동으로 실행되는 컴포넌트

 

(2) 프로젝트 적용 내용

- [1. 프로젝트 코드 변경 사항]에서 언급함

 

 

2) Validation

(1) 개념 설명

- Validation은 요청 파라미터를 검사해주는 기능이다.

- 컨트롤러 메소드의 파라미터에서 검사를 원하는 객체 앞에 @Valid를 붙이고, 바로 뒤에 있는 파라미터에는 반드시 검사결과 객체가 와야 한다. 해당 프로젝트에서는 BindingResult 객체를 사용했다.

public String testResult(@Valid SQLData sqlData, BindingResult result, Model model){...}

- @InitBinder 메소드는 Spring Validator를 사용할 때 @Valid으로 검증이 필요한 객체를 가져오기 전에 수행되는 메소드다.

@InitBinder("sqlData") // 참고로, @InitBinder의 파라미터에 @Valid 객체의 이름을 명시해두는 것이 좋다. 
protected void initBinder(WebDataBinder binder) { binder.setValidator(new SQLValidator()); }

- Errors.rejectValue() 메소드를 통해 문제가 발생한 필드의 이름과 에러 메시지를 함께 저장할 수 있다.

 

(2) 프로젝트 적용 내용

- 추가한 라이브러리 : spring-boot-starter-validation

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

- 검사 대상 : com.example.demo.vo.SQLData

- 검사 클래스 : com.example.demo.validator.SQLValidator

- 검사 내용 : 입력된 SQL문의 공백 여부와 위험한 키워드 검사

- 테스트 케이스

1. 공백 입력

2. SELECT * FROM AGRI_FOOD_INFO

3. SELECT * FROM COVID_VACCINATION_CENTER LIMIT 10

4. SELECT EVENT, WRITTEN_TEST_EXAMINATION FROM TEST_STATUS_BY_EVENT ORDER BY WRITTEN_TEST_EXAMINATION DESC

5. SELECT * FROM COVID_INFECTION_STATUS WHERE DATE BETWEEN '2021-07-10' AND '2021-07-20'

6.
SELECT *
FROM COVID_VACCINATION_CENTER
WHERE ID=1

7. DROP TABLE AGRI_FOOD_INFO

8. DELETE FROM AGRI_FOOD_INFO

 

 

3) Mybatis

(1) 개념 설명

- Spring에서 DB 연동을 도와주는 프레임워크들 중 하나 

- 자바 객체와 SQL 사이에서 자동 매핑을 도와줌

- SpringBoot에서는 @Mapper 인터페이스를 이용하여 손 쉽게 SQL을 저장할 수 있다.

 

(2) 프로젝트 적용 내용

- 사용자가 입력한 SQL문을 실행하여 결과를 받아왔다.

- 추가한 라이브러리 : mybatis-spring-boot-starter

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

- @Mapper 인터페이스 : com.example.demo.mapper.TestMapper

- com.example.demo.service.test.SQLResultClass

  • getResult() : TestMapper를 호출하여 SQL 실행 결과를 받아오고 예외 처리까지 담당한다. 
  • checkKeywords() : SQL문의 안전성을 검증하여 만약 문제가 있다면 Model에 에러 메시지를 추가하고 false를 반환한다.
  • checkSyntax() : SQL을 실행했을 때 예외가 발생했다면 Model에 에러 메시지를 추가하고 false를 반환한다.

 

 

3. 안내 사항

- 지금까지 강의에서 사용했던 소스코드들은 com.example.demo.example 패키지에 저장해두었으니 나중에 필요할 때 참고하면 된다.

 

 

4. 과제물 및 작업

- 다음주 토요일까지 수행할 것

과제물 : /test 페이지에서 잘못된 SQL을 입력했을 때 alert() 알람이 출력되는 과정을 자세히 txt 파일에 설명
작업 : jpa.repository에서 각자 가져왔던 샘플데이터에 대한 레포지토리를 생성하고, 그 안에 문제용으로 쓸만한 메소드를 3개 정도 작성해서 pull request

 

 

반응형

댓글