전체 글
-
Alphabet, String, LanguageCS/컴파일러 2024. 10. 29. 15:29
Finite Automata를 이해하기 위한 배경지식입니다.Finite Automata = 문자열을 처리하거나 패턴을 인식하는 데 사용되는 수학적 모델 1. Alphabet1) 정의: - 기호(symbol)의 유한집합. 문자열을 구성하는 기본 단위. - Σ 를 사용해서 표현 2) 예시: - 이진수: Σ = { 0, 1 } ( 이진수는 0과 1이라는 기호로만 이루어짐 ) - 영어: Σ = { a, b, ..., z } ( 영어는 a...z 기호를 사용해서 이루어짐 ) - 교통신호 알바펫: Σ={🔴, 🟡, 🟢} ( 신호등은 빨,노,초 3개의 등으로 이루어짐 ) 2. String1) 정의: - alphabet에 ..
-
Gradle이 무엇을 편리하게 해주는가?빌드 자동화 도구/Gradle 2024. 10. 23. 14:27
Gradle이 의존성 관리를 해주기에 편하게 프로젝트를 만들어왔는데요도대체 의존성 관리라는게 무엇인지? Gradle이 무엇을 해주는지 한번 보려고 합니다. 1. 수동으로 의존성 관리해보기간단한 프로젝트를 하나 만들어서 로그를 찍어봅니다.getPerson을 사용해서 Person 객체를 사용해서 로그를 찍었습니다. 이번에는 주어진 데이터를 기반으로 Person 객체를 만든 뒤, 로그를 찍어봅니다.json을 위해서 'Gson' 이라는 라이브러리를 사용하면 편리하니 사용하려고 합니다. Gradle을 사용한다면 dependencies 블럭에 코드 한 줄 추가해주면 끝나는 일이었겠지만,이번에는 그레들 없이 가보겠습니다. 구글에서 Gson을 검색해서 github을 찾아갑니다. 중간에 보면 gradle 혹은 ma..
-
.java 파일의 컴파일과 실행언어/자바 2024. 10. 22. 18:30
자바는 컴파일 언어이기 때문에 기본적으로 작성된 소스코드를 컴파일 하는 과정이 필요합니다.많은 것들을 IDE 가 제공하기 때문에 별 생각없이 사용하는데, 실제로 어떤 과정으로 동작하는지 살펴보겠습니다. 아래는 간단한 Main 코드 입니다. 우선 컴파일을 하여 .class 파일로 바꿔줍니다.저는 -d 옵션을 사용해서 out/classes 에 결과물이 생성되도록 하였습니다. $ javac -d out/classes src/java/org/study/Main.java 제가 지정한 경로에 .class 파일이 생성된걸 볼 수 있습니다. 이제 java 명령어로 Main.class 파일을 실행해줍니다.-cp (ClassPath) 옵션은 jvm이 실행시킬 대상을 찾는 경로를 설정해주는 옵션입니다.$ java -c..
-
Github Packages로 private maven repository 만들기빌드 자동화 도구/Gradle 2024. 7. 25. 16:39
업무 중에 두 프로젝트에서 공통된 부분을 어떻게 관리할 수 있을지 고민하던 중에 선택한 방법을 공유해봅니다. 글은 아래와 같은 순서로 진행됩니다.1. 작업을 시작한 배경2. 어떻게 개선할 것인가3. 로컬환경에서 publish 하기4. Github Packages 사용해서 gradle registry 만들기5. 라이브러리 적용하기6. 빈등록 이슈 해결7. CI/CD 파이프라인 생성 (optioanl) 1. 작업을 시작한 배경회사 코드를 바로 쓸 수 없으니, 비슷한 상황을 가정해보겠습니다저는 Greeting Project를 만들고 있습니다. 초기에는 간단한 기능들로 구성된 'Simple Server'를 구현해서 프로젝트를 운용 중이었습니다. 일을 하다보면 언제나 그렇듯.. 일정이 얼마남지 않은 ..
-
1.4.1 오브젝트 팩토리책/토비의 스프링 2024. 7. 8. 23:37
책을 읽고 흘려버리기 보단, 꼭꼭 씹어먹기 위해 정리해봅니다.이 포스팅은 이일민님의 에 기반하고 있습니다. 1. 문제의 상황어떤 Connection 구현 클래스를 사용할지 UserDao에서 결정하던 부분을 UserDaoTest로 이전해주었습니다.이번에는 UserDaoTest가 기능이 잘 동작하는지 테스트하는 것 + 사용될 클래스를 결정하는 것 이렇게 2가지일을 하게 되었습니다. 2. 해결방법새로운 클래스로 분리하기UserDao와 ConnectionMaker를 만드는 일, 그리고 두 객체의 관계를 맺는 일을 전담하는 클래스를 생성한다. 3. 팩토리 클래스를 만들기오브젝트를 생성하는 측과 사용하는 측을 분리하기 위해 만드는 목적!(추상 팩토리 패턴, 팩토리 메소드 패턴과 무관) 더보기public cla..
-
1.3.3 관계설정 책임의 분리책/토비의 스프링 2024. 7. 7. 16:10
책을 읽고 흘려버리기 보단, 꼭꼭 씹어먹기 위해 정리해봅니다.이 포스팅은 이일민님의 에 기반하고 있습니다. 1. 문제의 상황1) 클래스를 분리하였으나 여전히 UserDao가 특정 클래스의 이름에 대해 알아야함 2. 해결방법클래스 간의 관계 -> 오브젝트 간의 관계로 변경현재 UserDao는 new NConnectionMaker()를 생성자에서 실행함으로써, 어떤 ConnectionMaker를 사용할지 결정하고 있다.UserDao와 ConnectionMaker의 관계를 UserDao 속에서 결정하는 것이 아닌 외부의 다른 객체에서 진행한다. 3. 인터페이스와 의존성 주입을 통한 문제해결ConnectionMaker 인터페이스를 생성하여 고객사별로 구현을 하도록 만들고,UserDao는 ConnectionM..
-
1.3.1 클래스의 분리책/토비의 스프링 2024. 7. 7. 15:21
책을 읽고 흘려버리기 보단, 꼭꼭 씹어먹기 위해 정리해봅니다.이 포스팅은 이일민님의 에 기반하고 있습니다. 1. 기존 방법의 문제점책에서는 여러 가지 이유로 상속의 문제점에 대해서 이야기하고 있습니다. 하지만 언급하는 대부분의 내용들이 추상메소드를 상속하는 경우에는 해결이 되는 부분이라고 느껴져서 크게 와닿지 않았습니다. 특히 상속을 통한 상하위 클래스의 관계가 밀접하여 superclass를 변경할 경우 모든 서브클래스를 변경해야할 수 있다는 부분이있는데, 이 부분은 superclass 메소드의 시그니쳐가 바뀌지 않는한 subclass에서 변경을 신경쓸 필요가 없다고 생각이 듭니다. 만약 메소드의 시그니쳐가 바뀌는 경우라면, 인터페이스를 사용해도 동일한 부작용을 가져올 것이기 때문에 상속만의 문제는 아..
-
1.2.3 DB 커넥션 만들기의 독립책/토비의 스프링 2024. 7. 7. 14:42
책을 읽고 흘려버리기 보단, 꼭꼭 씹어먹기 위해 정리해봅니다.이 포스팅은 이일민님의 에 기반하고 있습니다. 1. 문제의 상황1) UserDao가 인기를 얻어 여러 회사에서 사용하고 싶어하는 상황2) 고객사별로 데이터베이스 연결에 대한 다양한 요청사항이 있음 MySQL, PostgreSQL 등 고객사별로 다양한 데이터베이스 사용 니즈혹은 동일한 데이터베이스를 사용해도 커넥션을 생성하는 로직이 상이함3) UserDao의 소스코드는 기밀이므로 고객사에 노출하지 않아야함 2. 해결방법고객사가 각자 회사의 입맛에 맞는 커넥션 로직을 구현할 수 있도록 방법을 제공하고, 구현된 로직을 UserDao에서 사용할 수 있도록 변경이 필요 3. 상속을 통한 문제해결2번의 해결방법을 추상메소드를 상속하는 방법으로 해결한다..