Layered Architecture in Java

Kim Dong Kyun·2022년 11월 24일
0

Today I learned

목록 보기
9/43

1. 3-Tier Architecture의 정의

![](https://velog.velcdn.com/images/calaf/post/019e9e4c-e695-4f65-9a2d-32430c49d668/image.png)
  • Presentation Tier
    - 프리젠테이션 계층은 일반 사용자가 애플리케이션과 상호작용하는 애플리케이션의 사용자 인터페이스 및 통신 계층입니다. 주요 목적은 정보를 표시하고 사용자로부터 정보를 수집하는 것입니다. 이 최상위 레벨 계층은 예를 들어 웹 브라우저, 데스크탑 애플리케이션 또는 그래픽 사용자 인터페이스(GUI)에서 실행될 수 있습니다. 웹 프리젠테이션 계층은 일반적으로 HTML, CSS 및 JavaScript를 사용하여 개발됩니다. 데스크탑 애플리케이션은 플랫폼에 따라 다양한 언어로 작성될 수 있습니다.
    - UI(User-Interface)
    - 위키 정의
    - 사람(사용자)과 컴퓨터시스템 사이의 의사소통 매개를 의미한다. 이 의사소통은 해당 기기에 대해 효율적인 작동과 사용자의 제어를 보장하는 것을 목표로 한다. 주변의 터치스크린, 마우스 등은 UI를 물리적으로 볼 수 있는 좋은 예시이다.
    - 일반적인 웹 또는 앱 서비스
    - 브라우저
    - Chrome, Safari, Firefox, Explorer, Whale, Edge
    - 앱
    - 안드로이드 앱
    - IOS 앱

    • Application Tier 논리 계층 또는 중간 계층이라고도 하는 애플리케이션 계층은 애플리케이션의 핵심입니다. 이 계층에서 프레젠테이션 계층에서 수집된 정보는 특정 비즈니스 규칙 집합인 비즈니스 로직을 사용하여 데이터 계층의 다른 정보와 비교하여 처리됩니다. 애플리케이션 계층은 데이터 계층의 데이터를 추가, 삭제 또는 수정할 수도 있습니다. 애플리케이션 계층은 일반적으로 Python, Java, Perl, PHP 또는 Ruby를 사용하여 개발되며 API 호출을 사용하여 데이터 계층과 통신합니다.
    • Data Tier 데이터베이스 계층, 데이터 액세스 계층 또는 백엔드라고도 하는 데이터 계층은 애플리케이션에서 처리하는 정보가 저장되고 관리되는 곳입니다. 이는 PostgreSQL , MySQL, MariaDB, Oracle, DB2, Informix 또는 Microsoft SQL Server 와 같은 관계형 데이터베이스 관리 시스템 이거나 Cassandra, CouchDB 또는 MongoDB 와 같은 NoSQL 데이터베이스 서버일 수 있습니다.

    출처: IBM(https://www.ibm.com/cloud/learn/three-tier-architecture)

2. 왜 이런 방식을 쓰는가?

SOILD 원칙을 따르기 위해서이다. 기능별로 나누어서
프레젠테이션 티어는 보여주는 역할만을
Aplplication Tier에서는 구동의 역할만을
DB는 데이터 저장의 역할 수행하게 한다.

즉,

> Presentation Tier -(기능요구)> Application Tier -(데이터 요구)> DB Tier

> DB Tier -(데이터 제공)> Application Tier -(기능 제공)> Presentation Tier

3. 우리팀이 연습해본 JAVA에서의 Layered Architecture.(초안)

  1. Entity
public class User {
    private String userID;
    private String passWord;
    private String userName;
    private String accountNum;
    private boolean isAdmin = false;

위와같이 Class를 만들고, 변수를 선언한다(필드를 생성한다)

2.DB(DB역할은 아니지만)

public class UserDB {
    private ArrayList<User> userList = new ArrayList<>();

    // 유저 등록( DB에 넣기)
    public void insertUser(User user){
        userList.add(user);
    }

    //모든 유저 조회(은행은 모든 계좌의 목록을 조회할 수 있다... 를 구현하기 위해서)
    public ArrayList<User> getAllUser(){
        return userList;
    }

    //유저 1명 조회 - 계좌번호로 찾기 (개인별 서비스용 - 수정/삭제/거래내역 조회 등)
    public User getUserByAccountNum(String accountNum){
        for(User user : userList){
            if(user.getAccountNum().equals(accountNum)){
                return user;
            }
        }
        return null;
    }

위와같이 유저 신규 등록 / 모든 유저 조회 등의 기능을 수행하는, 실질적으로는 Application에 해당하지만 DB로써도 기능하게...돼줬으면 해서 만든 클래스.

3.Logic(Application?)

public class UserLogic {
    UserDB userDB = new UserDB();

    public void signUp(String name, String id, String pw) {
        if (userDB.getAllUser() == null) {
            userDB.addAdmin();
        }
        for (User user : userDB.getAllUser()) {
            if (user.getUserID().equals(id)) {
                throw new IllegalArgumentException("아이디 중복");
            }
        }
        User user = new User(name, id, pw);
        userDB.insertUser(user);
    }

    public String login(String id, String pw) {
        for (User user : userDB.getAllUser()) {
            if (!user.getUserID().equals(id)) {
                throw new IllegalArgumentException("아이디 없음");
            }
        }

        for (User user : userDB.getAllUser()) {
            if (!user.getPassWord().equals(pw)) {
                throw new IllegalArgumentException("비밀번호 불일치");
            }
        }
        return "로그인 성공";

위와같이 로그인, 회원가입등의'기능'을 실행하는 로직. 물론 어플리케이션이라고 보기엔 미흡하다.

  1. Presentation(?)
public class UserUI {
    Scanner scanner = new Scanner(System.in);
    UserLogic userLogic = new UserLogic();

    public void signUp() {
        System.out.println("회원가입 진행");
        System.out.println("이름 입력");
        String name = scanner.nextLine();
        System.out.println("아이디 입력");
        String id = scanner.nextLine();
        System.out.println("비밀번호 입력");
        String pw = scanner.nextLine();
        try {
            userLogic.signUp(name, id, pw);
        } catch () {
        }
    }

위와같이 Scanner를 이용해서 자바 내에서 띄워주는 식. Presentation 이라기엔 미흡하긴 하다...

4. 위와같이 해보고 느낀 점.

  • 우리 팀은 위와같이 명확한 Layered의 구분을 이뤄내지는 못했다. DB/Application/Presentation 을 이용해 구분하려면 JAVA와 더불어 다른 툴이 필요할 것이고, 이제 차차 해나가게 되겠지. 그러나...
  • 분업이 훨씬 수월했다. 각자가 Entity, 기능구현, UI 구현등을 맡아서 처리함으로써 더 효율적으로 작업할 수 있었다.(물론 연습을 위해 다 같이 돌아가면서 수행했다.)
  • Git/Github를 사용하기 용이했다. 물론 이것도 배워나가는 단계지만...재미있었다.

0개의 댓글