과제 CH2. 트러블슈팅

kinkin_a·2025년 1월 9일

내일배움캠프 TIL

목록 보기
38/100

트러블슈팅1) -> 환경설정

  1. 개요
    처음에 코드 구현하고 런타임을 실행했을 때 애를 먹었던 환경설정에 따른 오류에 대해서 적어보려한다.

- 트러블 슈팅

  • 배경 : 코드는 아주 단순했는데, 실행이 안됨- 프로그램 환경설정 문제

  • 발단 : 검색해보니 프로그램 자바 버전은 23인데 JDK설정이 되어 있지 않았음. 과제 프로젝트라 자바버전을 17로 통일해야하기 때문에 개별적으로 설정을 해야함.

  • 전개 : File - Settings-Build,Execution,Deployment - Build Tools - Gradle순으로 들어가서
    Gradle을 전부 IntelliJ IDEA로 바꿔주니 해결

    📌Gradle JVM도 17로 바꿔주기.

  • 위기 : 작동에 문제 없다가 다시 발생
    에러를 검색해보니 코드 문법이 java 23 이하라 작동이 안된다고 한다.

  • 절정 : 우선 File- Project Structure 에 들어가 Project 설정을 전부 17로 변경.

    여전히 해결하지 못해 고민중이었는데, 튜터님의 도움으로 다행히 해결.


    File - Settings - Compiler - Java Compiler 에서 Project bytecode version17로 바꾸는 것.

    그 후 문제없이 잘 구동되었고, 덕분에 환경설정 하는 법에 대해 많이 알게되었다.

트러블슈팅2) -> Enum - 제네릭 코드 구현

  • 개요
    자바는 기초적인 것은 알아도 Enum,제네릭은 전혀 알지 못해 강의를 들어도 개념이 잘 와닿지 않았다. 강의복습을 여러번 해서 과제 코드 구현을 조금 했지만, 의도대로 작성했다는 느낌은 들지 않았다.

- 트러블 슈팅

  • 배경 : 과제Lv.3중에 Enum을 이용해 사칙연산 메소드를 구현, 제네릭을 이용해 int뿐만 아니라 여러 타입의 정수를 입력받도록 구현하라는 것이 있어 고민 시작.
  • 발단 : 일단 Enum에 대해 간략히 검색해보니, 수많은 상수를 필드로 두면 가독성이 자연스레 떨어지게 되고 그에 대한 대응책으로 나온 것이 가독성을 높이기 위한 상수 전용 클래스 Enum이라고 한다. 응용해서 단순한 상수뿐만 아니라 메소드까지 가능해, 이번 과제에서 연산기호를 Enum으로 구현하면 코드 가독성이 더 좋을 것이라 여겼다.

<Enum 정보출처 :https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%97%B4%EA%B1%B0%ED%98%95Enum-%ED%83%80%EC%9E%85-%EB%AC%B8%EB%B2%95-%ED%99%9C%EC%9A%A9-%EC%A0%95%EB%A6%AC>

(전보다 더 길어진 것 같다...)
코드 구현은 성공

  • 위기 : 진짜 문제는 제네릭을 어떻게 사용하는 건데, 일단 제네릭에 대해 정의해보자면 코드 중복성을 막기 위해 쓰는 새로 나온 코드로 결국 가독성과 간편함을 위해서 만들어진 코드라고 한다.
    과제 의도에 따라 입력 받은 자료형이 int,double 이든 상관없이 구동되려면, 제네릭 코드 로 감싸야 하는데, 정확하게 어느 부분에서 T를 써야할지 도통 감을 잡지 못했다.
    일단은 enum class에서 두 피연산자를 double대신 T로 바꾸었더니
    바로 에러가 발생했다.

    처음에 시도한 T문

    public enum<T extends Number> OperatorType{
         PLUS("+", (x, y) -> x + y),
         MINUS("-", (x, y) -> x - y),
         MULTI("*", (x, y) -> x * y),
         DIVIDE("/", (x, y) -> x / y);
    
         private BinaryOperator<T> op; // 람다식을 저장할 필드
    
         private String symbol;
    
         OperatorType(String symbol, BinaryOperator<T> op) {
             this.symbol = symbol;
             this.op = op;
         }
    
    ....
    
     public T apply(T x, T y) {
             return op.apply(x, y);
         }
    

    calculate 메소드에서 op.apply(double a, double b) 로 넘겨
    알아서 enum 클래스가 T로 치환해서 연산해주길 바랬으나, 실패.
    일단 BinaryOperator가 DoubleBinaryOperator 랑은 달랐고, T가 숫자형이 아니니 plus, minus 등 apply 연산이 전혀 되질 않았다.
    어떻게든 enum에서 제네릭으로 해결하려다 결국 포기하고,
    과제에서 말한대로 calculate에서 제네릭을 적용하면 되지 않을까 생각해 다시 코드 수정.

  • 절정:

  
    public <T extends Number> double calculate(T a, T b, char symbol) {
        OperatorType ot;

        this.x=a.doubleValue();
        this.y=b.doubleValue();
  • 결말 : 결국 calculate에서 main에서 어떤 자료형을 받든 상관없도록
    T로 설정하고 enum클래스로는 double 형으로 바꿔 넘기니 간단히 해결.
    과제의 의도대로 맞게 제네릭을 썼는지 궁금하다.

트러블슈팅3) -> IntelliJ에서 Git 연동

  • 개요
    IntelliJ에서는 terminal뿐만 아니라 git자체 메뉴도 있어서 잘만 연동하면 훨씬 편리하게 add commit을 할 수 있다.앞으로 git을 자주 사용할 일이 생길 것 같아 연동해보기로 했으나 계정 로그인에서 에러 발생

  • 배경 : gitHub와 IntelliJ와 연동할 필요성을 느끼고 terminal을 통해 계정 로그인 시도 - 로그인 계속 실패함

  • 발단 : 이유를 검색해보니 비밀번호대신 token을 생성해 입력하라 함

    내 프로필을 누르고 Settings- developer settings에 들어가 Personal access tokens 에서 Token 코드 발급받기

📌생성되면 바로 복사해서 사용하세요. 안그러면 사라집니다.

  • 전개 : 그래도 안돼서 다시 remote로 경로 설정 여러번 시도해서 겨우 로그인 성공.

    나중에 다시 찾아보니 Settings- Version Control- GitHub에서 로그인 해서 계정 연결하면 좀 더 쉽게 연결할 수 있다.
    나는 터미널을 통해서 로그인이 됨.

    git- Manage Romote(원격 관리) 에서 + 버튼을 누르고 리포지토리 주소 입력해서 연결'

    그 후 git-commit으로 수정된 파일 추가하고, git-push 로 리포지토리로 업데이트 하면 된다.

  • 위기 : 그런데 main에서 직접적인 파일 추가를 하는 바람에 다른 브런치에는 push가 잘 되지만 main에서는 충돌이 발생함.

    원격 저장소 main에서 파일을 직접적으로 삭제하고 추가한 것이 충돌의 원인.

git pull --rebase origin main

으로 원격저장소의 최신 상태를 불러오고
차이점을 비교하면서 충돌 파일을 수정해 add-commit함.

아래 사이트에 좀 더 자세한 방법이 나와있다.

출처: https://kylo8.tistory.com/entry/Git-git-push%EB%A5%BC-%ED%95%98%EB%A0%A4-%ED%95%A0-%EB%95%8C-rejected-main-main-fetch-first-error-failed-to-push-some-refs-to-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95

하지만 그 후에 다시 이런 에러가 발생.
여전히 충돌.

  • 절정 : 폴더에 직접 들어가서 확인해 보니 pull 명령어는 적용되어 main 리포지토리의 파일들이 있었으나, push는 충돌이 일어남.
    사실 튜터님 강의에 따르면 이럴 땐 push를 강제적으로 여러번 하면 해결된다 한다.

    📌 혹은 git push origin +main으로 강제적으로 한번에 해결
    하지만 코드 손실이 있을 수 있으니 조심해야함

  • 결말 : 일단 다른 branch를 생성해서 업로드하고, main에는 직접적으로 파일을 올려서 해결. 아마 합병하고 싶어도 main에서 또 충돌이 일어나 해결하기 쉽지 않을 것 같다.
    ->튜터님의 도움으로 리포지토리를 새로 생성해 새로 올리는 것이 제일 빠른 길임을 배움.

    📌 리포지토리에 직접적인 파일 업로드나 삭제는 최대한 지양하기로 함. 특히 협업때는 절대 main branch를 직접적으로 건드리지 말 것.

    아직 github가 너무 어려워서 공부가 많이 필요할 것 같다.

0개의 댓글