내배캠/프로젝트, 개인과제 트러블슈팅

[내일배움캠프/백엔드] Spring 입문 개인과제 일정 관리 앱 만들기 트러블슈팅

jy3574 2024. 11. 8. 12:34

<배경> - 어떤 현상을 발견했는가?

1. IntelliJ 내부에서 Database 를 작성하는 중에 오류 발생

database

2. 설정오류

2-1. interface expected here

2-2. cannot find symbol method

2-3. method does not override or implement

 

3. ERROR 49429

 

4. properties 오류 

properties

5. Internal Server Error

postman error 500

6. Not Found

postman error 404

 

<발단> 이런 장애가 생길 수 있다는 것을 인지

1. IntelliJ 내부에서 Database 를 작성하는 중에 오류 발생

-database 라는 것을 생각을 못하고 Long id 라고 적어서 오류 발생

 

2. 설정오류

2-1. interface expected here

2-2. cannot find symbol method

2-3. method does not override or implement

-scheduleRepository를 interface가 아닌 class로 설정해놔서 생긴 오류

 

3. ERROR 49429

-Spring 애플리케이션 시작 과정에서 발생한 문제

-특정 조건이 충족되지 않으면 애플리케이션이 정상적으로 실행되지 않는 경우

 

4. properties 오류

- Lv1, Lv2 controller 동시 실행

 

5. Internal Server Error

-필드 이름이 틀림

 

6. Not Found

-경로 설정 오류

-api 경로 설정을 해줘야함

 

<전개> 장애를 대응, 해결하던 와중에

1. IntelliJ 내부에서 Database 를 작성하는 중에 오류 발생 (해결)

-Java 의 Long 타입 = Database BIGINT 타입

-Database 는 SQL 데이터 타입을 사용하니까 long 타입은 없음

 

2. 설정오류 (해결)

2-1. interface expected here

2-2. cannot find symbol method

2-3. method does not override or implement

-세 오류 다 SceduleRepository를 interface 가 아닌 class로 지정해서 생긴 문제

-코드에서 저장소를 ScheduleRepository(Interface), JdbcTempScheduleRepository(Class) 두개로 나눈 이유는 데이터 접근을 용이하게 하기 위해서 나눴는데 설정을 잘못했다.

-이렇게 저장소를 두개로 나누게 되면 데이터베이스 없이 테스트할 수 있다는 장점도 있고, 코드의 가독성이 좋아진다.

 

3. ERROR 49429 (해결)

-application.properties에 datasource를 넣지 않아서 생긴 오류

spring.datasource.url=jdbc:mysql://localhost:3306/schedules
spring.datasource.username=root
spring.datasource.password=비밀번호
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

이렇게 설정을 해주니 해결

 

4. properties 오류 

- Lv1, Lv2을 나눠서 구현했는데 그러다보니 controller가 2개가 되고 이름도 같아서 controller 동시 실행되면서 오류가 생겼다.

-controller 이름을 lv1controller, lv2controller로 바꾸면 됨 -> 복잡하고 뭔가 다른 오류가 생김

 

5. Internal Server Error (해결)

-코드에는 name으로 설정을 해놓고 postman으로 테스트를 할때는 user_name을 써서 오류 발생

-user_name을 name으로 바꿔주면 해결됨

 

6. Not Found (해결)

-api 경로 설정을 해줘야함

-json 형태로 주고받기 위해서 /api/schedules가 되야함

-Restful API 설계의 규칙으로 클라이언트가 서버의 특정 리소스에 접근할 수 있도록 경로를 설정

 

<위기> 또 다른 장애 발견 또는 간단하게 해결할 수 없다는 것을 알게 되어서

&  <절정> 근본적인 해결을 위해 이런 방법으로 접근하였다.

1. 해결

 

2. 해결

 

3. 해결

 

4. properties 오류 

-구글링을 해보니 controller 이름을 변경하면 된다고 하는데, 바꾸려니까 헷갈리기도 하고 뭔가 다 안바꿔졌는지 오류가 생겨서 다른 방법을 찾아봄

-다른 방법을 찾아보니 profile 을 설정하면 된다고 해서 적용해봄

-resources -> application.properties 들어가서 spring.profile.active = 원하는 프로파일지정

ex> spring.profiles.active = Lv2

     -profile이 Lv2라고 설정된 것만 활성화됨

 

-이 방법을 사용하기 위해 Controller, Service, JdbcTemplateRepository 이렇게 세군데에 설정을 해놨더니 해결됨

 

5. 해결

 

6. 해결

 

<결말> 따라서 이런 방법을 통해 근본적으로 해결 및 앞으로 유지, 보수에 용이하게 개선하게 되었다.

-오류들을 해결하면서 profile 설정을 통한 controller 중복문제를 알게 되었고, 이를 통해 개발환경에서 시스템관리와 유지보수를 할 때 profile 사용의 중요성에 대해서 알게 되었다. 그리고 데이터베이스와 java 간의 호환성 등에 대해 다시 한번 생각하고 이해해보게 되었다. 추가로 튜터님께 여쭤본 것 중에 매개변수와 관련된 것이 있었는데 헷갈리던 부분을 찾아서 다시 공부해봤다.

 

-저장소(repository)를 인터페이스와 클래스 두개로 분리하면서 테스트가 쉬워지고 코드 가독성이 올라가는 것을 직접 깨닫게 되었다. 그리고 이렇게 저장소를 분리하게 되면 다양한 클래스를 만들 수 있어 코드 수정할때 interface만 바꾸면 된다는 유연성이 있다는 것도 알게 되었다.

 

-이번 과제를 하면서 패키지와 클래스를 나누면서 하다보니 헷갈리는 부분이 많아졌고, 오타도 생각보다 너무 많이 났다. 이를 통해 이름을 항상 직관적이고 규칙성 있게 적고, 경로 설정도 한번더 체크하고, 오류를 줄일 수 있는 방법에 대해서 생각하면서 코드를 짜야겠다고 다짐했다. 그리고 과제 순서대로 설계 후 코드를 짜니 어느 부분이 빠졌는지 확실하게 체크가 되서 좋았던 것 같다.


<매개변수> - 다시 공부

1. 기본 타입, 참조 타입

-기본 타입 : int, double

  • 기본 타입은 값이 복사되어 전달된다.
  • 매개변수로 받은 값을 변경해도 원래 변수는 영향을 받지 않는다.

-참조 타입 : String, List

  • 객체의 주소가 전달된다.
  • 메서드 내에서 객체의 속성 값을 변경하면 원래 객체에도 영향을 끼친다.
  • null 값을 가질 수 있다.
  • Optional 을 사용하여 null을 처리하거나 방지하는 방법 고려해야한다.

2. 변경 불가능한 객체

-대문자로 시작하는 String, Integer, Double 같은 애들은 값을 변경할 수 없다.

-새 값을 할당하면 새로운 객체가 생성된다.

 

3. 가변 매개변수

-가변적으로 인수를 전달 받을 수 있다.

-항상 마지막에 위치하며, 메서드 내에서 배열처럼 다룰 수 있다.

타입 ... 변수명

 

4. 메서드 오버로딩

-메서드 오버로딩을 통해 같은 이름의 메서드를 여러 개 정의할 수 있는데, 이때 매개변수의 타입과 개수가 달라야한다.