회원 관리 바닐라 자바로 만들기 Comprehensive (1)

Hailey·2025년 2월 21일

JAVA

목록 보기
3/8
post-thumbnail

CQRS(Command and Query Responsibility Segregation)

명령 쿼리 책임 분리 : 데이터 저장소에 대한 읽기 및 쓰기 작업을 별도의 데이터 모델로 분리하는 디자인 패턴

ex) 조회와 조회 아닌거 따로
query와 query가 아닌 나머지(command)라고 함

Command

1)Application - controller, service
2)Domain - repository..등
3)Infrastructure -

db에서 JPA이용


  • 서비스 계층에서는? :
    비즈니스 로직( 가공처리 흐름 트랜잭션 제어 유효성 검사 )

  • 레포지토리 : 쿼리를 날리거나 입출력을 날리거나...데이터베이스같은 역할.

Query

1) C : controller
2) S : service
3) DAO

db에서 Mybatis 이용


aggregate / db / repository / run / service / stream 폴더(패키지)를 만든다

그래서 DB랑 통신하기 위한 곳은 repository에 만들고,

DB와 통신하기 전에 해야하는 가공처리(트랜잭션 제어, 비즈니스 로직)은 service 에 만든다. 이는 개발을 위해(x), 유지보수를 편리하게 하기 위해!!

어떤 이벤트가 일어나면 발생하는 모든 data는 aggregate 에서 클래스로 관리한다.

회원을 다시 전체 덮어씌우는 것이 아닌 이어붙이기 위해 MyoutputStream...을 출력하기 위한 곳이 stream


Scanner

Scanner 클래스

입력 클래스 중 하나로 java.util 패키지 안에 있습니다.
(import java.util.Scanner;)

코드 자세히 뜯어보기

Scanner sc = new Scanner(System.in);
int input = sc.nextInt();

sc는 Scanner 객체의 이름이고, 이 이름을 이용해 이후에 입력받는 메서드들을 호출합니다.
new객체 생성자 이고, Scanner() 는 Scanner 클래스의 생성자 를 호출합니다. 그래서 두 개가 합쳐져서 Scanner의 객체를 생성하게 되는 것이다.
System.in표준 입력 스트림을 나타내는 객체!!!입니다. 키보드로부터 입력을 받기 위해 사용되며, 사용자가 입력한 데이터를 읽어오는 역할을 합니다.

표준 입력스트림이란?

: 컴퓨터 프로그램이 외부로부터 입력데이터를 받기 위한 기본적인 통로!
System클래스(표준 입출력 처리) 안에 InputStream 추상 클래스(바이트기반 입력 스트림) 있다.

System.in은 객체이다!

: System.in은 InputStream 추상클래스의 객체(인스턴스)이다.

InputStream이 애초에 바이트 기반 입력 스트림의 추상클래스이기 때문에 System.in도 바이트 단위로 입력을 받는다. 그러나 대부분 우리가 입력받고 싶은 데이터는 문자열이나 정수이다.

그래서 이를 더 쉽게 처리하기 위해 Scanner클래스가 등장한 것이다.

그래서 System.in은 입력을 받아오는 통로역할만 하는 도구이고, Scanner는 입력데이터를 정수, 문자열, 실수 등으로 가공해주는 도구라고 생각하면 됩니다.

. 연산자 + 속성/메소드

Java에서 .(점) 연산자는 객체나 클래스멤버(속성이나 메서드) 에 접근할 때 사용돼요. 그렇다면 sc.nextInt()는 무엇을 뜻할까요?

Scanner()를 통해 sc 객체를 생성하고 이 객체에서 정수를 받아오는 메소드를 이용해 정수를 입력받는것입니다!

Scanner의 주요 메서드

  • nextInt() : 정수
  • nextDouble() : 실수
  • nextLine() : 한 줄 전체 입력받음
  • next() : 공백 전까지의 문자열 입력받음
  • hasNext() : 입력값이 있는지 여부 확인 (참/거짓 반환)

Tip: 정수나 실수를 입력받은 후 nextLine()을 바로 사용하면 입력 버퍼에 남아있는 개행 문자(\n) 때문에 에러 발생. 그래서 sc.nextLine(); 을 호출하여 버퍼를 비워야 한다.


final 쓰는 이유?

객체 + final은 객체 자체가 재할당(다른 객체로 대체)되는 것을 막습니다. 그래서 한 번 초기화된 후에는 다른 객체로 다시 할당할 수 없습니다.

이는 멀티스레드 환경에서, 여러 스레드가 동시에 같은 객체에 접근하거나 수정할 수 있습니다. 예를 들어, A와 B가 서로 같은 객체에 접근할 때, B가 새로운 객체로 재할당하여 시도하고, A는 재할당되기 전의 객체에서 작업을 시도하면, 서로 데이터에서 충돌이 발생한다.

그래서 객체의 재할당을 막아야합니다. 그렇게 하면, 모든 스레드가 동일한 인스턴스를 공유할 수 있습니다.

객체 자체가 불변성을 유지하면 동기화를 하지 않고도 안전하게 데이터를 읽고 쓸 수 있습니다.


추가) 멀티스레드환경, 스레드란?

스레드는 프로그램 내에서 작업을 실행하는 가장 작은 단위입니다.
하나의 프로그램(프로세스)은 여러 개의 스레드를 가질 수 있으며, 각각의 스레드는 독립적으로 실행될 수 있어요.

  • 프로세스(Process): 하나의 독립적인 실행 프로그램 (예: 유튜브 앱)
  • 스레드(Thread): 그 프로그램 안에서 동시에 실행되는 작은 작업 단위 (예: 유튜브에서 동영상 재생, 댓글 읽기, 알림 받기 등)

즉, 하나의 프로그램(프로세스) 안에서 동시에 여러 작업을 처리하기 위해 스레드가 사용됩니다.


다시, final 예제로 돌아와서,

final int number = 10;
number = 20;  // ❌ 에러 (final 변수는 재할당 불가능)

위는 변수 예제인데, 변수는 재할당이라는게 안의 값을 바꾸는 것을 의미합니다. 따라서 변수에 쓰면, 값을 고정하는 역할을 합니다.

final MemberRepository mr = new MemberRepository();
mr = new MemberRepository();  // ❌ 에러 (새 객체로 재할당 불가능)

하지만, 위 객체 예제에서는, 재할당이라는 것이 객체 자체를 바꾸는 것을 의미합니다. 따라서, 객체 내부의 값을 변경할 수는 있습니다!

즉, 객체 자체의 속성이나 메서드를 사용하는 것은 가능합니다. 객체 자체가 새로 생성/재할당되는 것만 불가능하다는 뜻입니다.

일반적인 JAVA에서 final의 의미

위 블로그 내용을 정리하자면, 아래와 같다.

  1. final 변수, 인자는 초기화 이후 값을 변경하지 못하게 하고
  2. final 클래스면 다른 클래스가 상속할 수 없는 클래스가 된다.
  3. final 메소드면 오버라이딩할 수 없는 메소드가 된다.
    : 같은 이름의 메소드에 새로운 기능을 재할당 할 수 없다! 즉 재정의할수 없다!

추가) 오버라이딩 vs 오버로딩

오버라이딩은 아예 재정의이지만,
오버로딩은 과적, 즉 같은 이름의 메소드가 여러개 있을 수 있다! (인자만 다름)


추가) 불변객체 만들기-private final

  • 불변객체: 한번 생성되면 상태가 변하지 않는 객체
    따라서, 내부 데이터가 절대 변경되지 않기 때문에, 여러 스레드가 동시 접근해도 문제가 발생하지않는다.

  • Java에서 불변 객체를 생성하는 법
    : Java에서 불변 객체를 생성하기 위해서는 다음과 같은 규칙에 따라서 클래스를 생성해야 한다.

  1. 클래스를 final로 선언.

  2. 모든 클래스 변수를 private와 final로 선언.

  3. 객체를 생성하기 위한 생성자 또는 정적 팩토리 메소드를 추가.

  4. 참조에 의해 변경가능성이 있는 경우 방어적 복사를 이용하여 전달.


static이란 무엇인가?

  1. 접근제어자: public, private, protected, default

  2. static은 접근제어자x,
    정적 변수(static variable)나 메서드(static method)를 정의할 때 사용하는 키워드입니다.....

static은 '클래스 레벨의 메모리 영역'에 할당된다'라는 뜻

클래스가 메모리에 로드될 때 딱 한 번만 생성됩니다.

따라서 static을 쓰면, 모든 객체가 공유한다 는 뜻이다!

(즉, 객체가 아닌 클래스 레벨에서 이미 생성되므로, 인스턴스/객체를 생성하지 않고도 static 변수/메소드에 접근 가능)

  • 일반 변수/메서드: 학생 개개인의 점수 (각 객체에 고유하게 존재)
  • static 변수/메서드: 모든 학생이 공유하는 학교 이름 (모든 객체가 동일하게 공유)
  • static 변수 및 static 메소드 사용목적
    : 모든 클래스에서 호출 가능한 전역변수나 전역함수 사용하려고!
    : static 멤버는 클래스당 하나만 생성되어, 클래스의 인스턴스 사이에서 공유됨으로 공유멤버가 필요할 때 사용...

  1. static은 객체가 아닌 클래스 레벨에서 동작하는 키워드입니다.
  2. 모든 인스턴스가 공유하는 데이터나 메서드를 정의할 때 사용됩니다.
  3. 객체 생성 없이도 호출이 가능하며, 주로 유틸리티 클래스에서 많이 사용됩니다.

추가적으로 JVM 메모리 영역에 대해서 다시 공부할 것 있으면 하기...

JVM

1. 스택 영역(지역 변수)
2. 힙영역(객체/인스턴스)
3. 메서드영역(클래스,static 변수 static 메소드)

profile
럭키헤일리

0개의 댓글