ㄴㅏ랏말ㅆ.ㅁㅣ
article thumbnail

좋은 코드와 Controller분리

  • 좋은 코드는 왜 중요한가?
  • Controller 3단 분리하기 Service, Repository

좋은 코드와 Controller분리

  • 좋은 코드는 왜 중요한가?
  • Controller 3단 분리하기 Service, Repository

좋은 코드는 왜 중요한가?

코드만 보고도 어떠한 기능을 하는지 알 수 있도록 해야지 협업을 하는데 있어서나 시간을 절약할 수 있다

않좋은 코드가 쌓일수록 생산성 떨어짐

하나의 클래스에 여러가지 동작이 있다면?

  1. 그 함수를 여러 명이 동시에 수정할 수 없다,
  2. 그 함수를 읽고, 이해하는 것이 너무 어렵다
  3. 함수의 어느 부분을 수정하더라도 함수 전체에 영향을 미칠 수 있어 수정이 어렵다
  4. 너무 큰 기능이어서 테스트 하기 힘들다

-> 유지보수성이 떨어진다

Clean code

함수는 최대한 작고 한 가지 일만 수행하는 것이 좋다

클래스는 작아야 하며 하나의 책임만을 가져야 한다

Controller 3단 분리하기 Service, Repository

Controller의 기존 역할

1. API의 진입 지점으로 HTTP Body를 객체로 변환 -> Controller
2. 현재 유저가 있는지, 없는지 등을 확인하고 예외 처리 -> Service
3. SQL을 사용해 실제 DB와의 통신을 담당 -> Repository

Repository -> Service사용 -> Controller사용

이러한 구조를 Layered Architecture라 한다

의문점

Controller에서는 JdbcTemplate을 가져오는데 어디에서 가지고 오는건가?


문제

  1. 코드 더 좋은 코드로 고치기

기존 코드

public class Main {
    public static void main(String[] args) {
        System.out.print("반복 횟수를 입력해 주세요 : ");
        Scanner sc = new Scanner(System.in);

        int a = sc.nextInt();

        int d1 = 0, d2 = 0, d3 = 0, d4 = 0, d5 = 0, d6 = 0;

        for (int i = 0; i < a; i++) {
            int b = (int) (Math.random() * 6);

            if (b >= 0 && b < 1) {
                d1++;
            } else if (b >= 1 && b < 2) {
                System.out.println(b);
                d2++;
            } else if (b >= 2 && b < 3) {
                System.out.println(b);
                d3++;
            } else if (b >= 3 && b < 4) {
                System.out.println(b);
                d4++;
            } else if (b >= 4 && b < 5) {
                System.out.println(b);
                d5++;
            } else if (b >= 5 && b < 6) {
                System.out.println(b);
                d6++;
            }
        }

        // 결과 출력
        System.out.printf("1은 %d번 나왔습니다.\n", d1);
        System.out.printf("2는 %d번 나왔습니다.\n", d2);
        System.out.printf("3은 %d번 나왔습니다.\n", d3);
        System.out.printf("4는 %d번 나왔습니다.\n", d4);
        System.out.printf("5는 %d번 나왔습니다.\n", d5);
        System.out.printf("6은 %d번 나왔습니다.\n", d6);

    }
}

고친 코드

public class Main {
static final int NUMBERS_RANGE = 6;
public static void main(String[] args) {
System.out.print("반복 횟수를 입력해 주세요 : ");
Scanner sc = new Scanner(System.in);

        int TryNumber = sc.nextInt();

        int number_cnt[] = new int[TryNumber];

        for (int i = 0; i < number_cnt.length; i++) {
            int dice = (int) (Math.random() * NUMBERS_RANGE);

            number_cnt[dice]++;
        }

        // 결과 출력
        for (int i = 0; i < NUMBERS_RANGE; i++) {
            System.out.println(i + 1 + " 은(는) " + number_cnt[i] + "번 나왔습니다.");
        }

    }
}

출처

profile

ㄴㅏ랏말ㅆ.ㅁㅣ

@동여우

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그