Programming Language 이해하기39 Java 에서 패키지(Package) 라는 것을 왜 사용해야만 할까? 자바에서 사용하는 패키지는 왜 사용할까? 일단 Java 에서 Package 라고 하면 다음과 같이 생각하는 것이 일반적이다.패키지(Package) 패키지란? 클래스의 묶음으로 클래스를 용도별이나, 기능별로 그룹화 [참고 - https://wikidocs.net/231]이것을 고민했던 이유는 다음과 같습니다.이걸 보면, Zzzz 클래스는 아무런 패키지없이도 만들 수 있습니다. 그런데 패키지가 왜 필요한거지?멘토링을 진행하면서 '이렇게 패키지 구조를 만들었는데, 적절한가요?' 라는 질문을 정말 많이 받았는데요. 이 질문에 답변을 하는 과정에서 패키지 구조만 보고 내가 어떻게 적절하다고 판단을 하지? 라는 생각을 했습니다. 적어도 옛날에 읽었던 클린 소프트웨어 책에서 패키지는 이렇게 하는거야! 라는 내용을 읽.. 2024. 10. 3. Java의 비동기(Async) 프로그래밍을 제공하는 JDK를 다시는 무시하지 말자! 개발을 하다보면, 어깨너머 듣는 이야기가 '비동기 언제 사용해요?', 'Redis 의 스핀락 사용해보셨어요?', '메세지 큐를 활용한 비동기 프로그래밍' 등등의 뭔가 어려운 것들을 나한테 묻곤 하는데, 잘 사용해본 적도 없을 뿐더러, 이미 Java JDK 에서 충분히 제공되고 있다고 생각했다. 이래서 한번 언젠가는 정리해봐야지- 라고 생각만하다가 드디어 알아본다.알아볼 Java의 비동기 프로그래밍1. Thread2. ExecutorService3. CompletableFuture4. Flow상황은 다음과 같습니다. SomethingCounter 가 있습니다. 해당 객체는 다음과 같이 count 를 가집니다.final class SomethingCounter { // 횟수 Integer cou.. 2024. 7. 28. gradle 에서 apply from: xxx 은 무슨 의미이지? apply from: xxx 을 이해하기 위해서는 gradle 의 Plugin 을 알아야 합니다. Gradle 의 Plugin 은 무엇을 하는 걸까요? 프로젝트에 플러그인을 적용하면 플러그인이 프로젝트의 기능을 확장할 수 있습니다. 다음과 같은 작업을 수행할 수 있습니다. - Gradle 모델 확장(예: 구성할 수 있는 새 DSL 요소 추가) - 규칙에 따라 프로젝트 구성(예: 새 작업 추가 또는 합리적인 기본값 구성) - 특정 구성 적용(예: 조직 리포지토리 추가 또는 표준 적용) 프로젝트 빌드 스크립트에 논리를 추가하는 대신 플러그인을 적용하면 많은 이점을 얻을 수 있습니다. 플러그인 적용: - 재사용을 촉진하고 여러 프로젝트에서 유사한 논리를 유지 관리하는 오버헤드를 줄입니다. - 높은 수준의 모듈.. 2022. 2. 6. #2 스터디 할래 - 2주차 목표 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다. 학습할 것 프리미티브 타입 종류와 값의 범위 그리고 기본 값 프리미티브 타입과 레퍼런스 타입 리터럴 변수 선언 및 초기화하는 방법 변수의 스코프와 라이프타임 타입 변환, 캐스팅 그리고 타입 프로모션 1차 및 2차 배열 선언하기 타입 추론, var --- 프리미티브 타입 종류와 값의 범위 그리고 기본 값 자바는 사용할 수는 자료형을 크게 2가지로 나눕니다. 1. Primitive Type 2. Referance Type 1. Primitive Type 은 쉽게 우리가 알고 있는 int, long, double, boolean, byte 등이 있습니다. 각각의 타입에 대한 범위는 어떻게 될까? 아니 이 범위를 왜 알아야할까부터 고민.. 2021. 11. 14. Java LocalDateTime.toString()은 JavaScript에서 어떻게 호환될까? 폴리글랏으로 프로그래밍하며, 여러 언어로된 도메인끼리 메세지를 보내다보니 파일 포맷에 대한 이슈가 있었다. LocalDateTime.now() 를 외부에 전송하게 되면 "2021-11-02T00:05:03.128" 이런식의 String 으로 발송된다. Javascript 에서 이를 호환된 포맷으로 전송하기 위해서는 moment 를 사용할 경우에는 아래와 같은 포맷으로 작성하면 된다. moment.tz('Asia/Seoul').format('YYYY-MM-DD[T]HH:mm:ss.SSS') 참고자료 https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns DateTimeFormatter (Java Pl.. 2021. 11. 2. #1 스터디 할래 - 1주차 1. JVM이란 무엇인가? JVM 은 Java Virtual Machine 의 약자로서, Java 가 동작될 때 동작될 수 있는 플랫폼을 제공해준다. 이는 즉 다시 말하면 Java로 개발한 프로그램을 컴파일하여 만들어지는 바이트코드를 실행시킬 수 있는 가상머신이다. JVM 의 가장 큰 특징으로는 Write one, Run anywhere 라는 모토이다. 이는 어떤 OS의 제약에도 해당되지 않는 것과 같다. JVM의 컴파일러가 .java 소스파일을 컴파일하면 .class 클래스 파일을 JVM에게 건네주게 되면 JVM이 클래스파일을 메모리에 로드하여 실행할 수 있다. 여기서 컴파일러는 프론트엔드에 속하고, JVM은 백엔드에 속한다. 이말은 위에서 말한것과같이 .java 를 Compiler 를 통해 Compi.. 2021. 10. 30. 객체지향의 재사용성과 다이나믹 디스패치, 더블 디스패치에 관한 이야기 토비의 스프링 저자 이일민님의 유튜브 강의 내용입니다. Dependency 란 무엇인가? - 의존 관계(dependency relationship) - Supplier의 변화가 Client에 영향을 주는 경우 우리는 어떤 것을 보고 의존관계라고 말할 수 있을까? - Supplier가 Client의 빌드일때, - Supplier가 Client 메소드의 파라미터 - Supplier가 Client 로컬 변수 - Supplier로 메세지를 보낼때 Dependency는 재사용가능한 객체지향 설계/개발에 대해서 - Client는 재사용이 어렵다. - Client는 컴포넌트/서비스가 될 수 없다. "컴포넌트란 이를 만든 개발자의 손이 미치지 않는 곳에서도 아무 변경 없이, 필요에 따라 확장해서 사용될 수 있는 소프트.. 2021. 3. 6. replaceFirst()과 정규표현식의 실수 @Test public void korean_possible_replace() { String target = "다우\\\"기술\" OR\t_xxx:[10 TO 100]"; String regEx = "다우\\\"기술"; // 정규식(regEx)을 패턴으로 만들고, Pattern pat = Pattern.compile(regEx); // 패턴을 타겟 스트링(target)과 매치시킨다. Matcher match = pat.matcher(target); // System.out.println(match.find()); String s = target.replaceFirst(regEx, ""); System.out.println(s); } pat.matcher(target) 은 false가 나옵니다. 이유는 .. 2021. 2. 26. Character.isDigit() 의 반란...! 사내 서비스를 유지보수하던 중에 있었던 황당한 일이였습니다. Solr 쿼리에 쿼리로서 q를 보내는 중에 숫자 -999 는 자꾸 잘못된 값이라는 버그가 발생. 해당 함수는 아래와 같다. private Literal scanNumber() { StringBuffer sb = new StringBuffer(); while (scanner.hasNext()) { char ch = scanner.next(); if (!Character.isDigit(ch)) { scanner.backward(); break; } sb.append(ch); } if (sb.length() 2021. 2. 26. 예외를 처리하는 Best Practice는 무엇일까?(with. 토비 스프링, 이펙티브 자바) 들어가기 예외를 어떻게 하면 우아하게 처리할 수 있을까? 위 질문의 답을 찾기 위해- 이제부터 토비 스프링의 책 내용과 이펙티브 자바의 내용을 소개하고자 한다. 예외 블랙홀 예외를 잡고 아무 행위도 하지 않는다. 이것은 굉장히 위험한 행위이다. 이런 코드도 마찬가지로 위험한 코드이다 그렇다면? 어떻게 해야될까? 예외를 처리할 때는 모든 예외는 적절하게 복구되든지 아니면 작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보돼야 한다. 또한 Throws 는 무의하고 무책임하다. 바로 아래와 같은 코드를 말한다. 위 두 가지 나쁜 습관은 어떤 경우에도 용납하지 않아야 한다. Item77. 예외를 무시하지 말라. - 이펙티브 자바 왜 우리는 예외를 명시하는 이유가 무엇인가? API 설계자에게 메서드 선언에 예.. 2021. 1. 4. [Vue]왜 mutation 에서는 왜 비동기(async wait 문법)를 사용하면 안될까? (수정: 되긴 된다) 이번에 Vue 프로젝트를 진행하면서 mutations의 남용으로 Vuex에 대한 이해를 도왔습니다. 그 부분을 조금 더 자세히 기입합니다. 문제 발생 mutations: { ... async getUserInfos(state, loginId) { const basicUserInfo = await UserInfoApi.getUserInfoById(loginId); state.userinfo.userId = basicUserInfo.data.userId state.userinfo.userLoginId = basicUserInfo.data.userLoginId state.userinfo.userName = basicUserInfo.data.userName state.userinfo.dutyName = basi.. 2020. 12. 26. [Vue] vue-router에서 Hash Mode Vs History Mode 차이점은 무엇인가? 들어가기 최근 Vue 를 사용하게 되면서 Hash Mode와 History Mode에 대해서 의문점을 가지게 되었습니다. Vue.js에 router 관련된 설정을 추가하면서 다음과 같은 설정에 직면하게 되었습니다. import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) export default new Router({ mode: 'history', base: process.env.BASE_URL, routes: [ { .... } ] }) 여기서 history와 hash를 String으로 작성하여 설정할 수 있습니다 그렇다면 이 둘의 차이점은 무엇일까? 대체 무슨 차이이지? Hash mode Hash mode는 모든 URL을 HASH(.. 2020. 12. 8. Vuex 의 상태 값의 변화를 감지해서, data 에 반영하는 방법 이번 사내에서 Vue.js 를 활용한 웹 프로젝트를 진행하면서 echart 라이브러리를 통해 깊숙하게 활용하게 되었습니다. 한 페이지에 수십개의 차트 라이브러리가 만들어지고, 이를 사용자에게 보여주는 프로젝트입니다. 여기서 처음 Vue.js와 Vuex를 활용하면서 vuex에 state 값을 어떻게 하면 data에 있는 값에 반영시킬 수 있을까? 라는 고민을 하루 이상했습니다. 이 과정에서 computed 와 watch에 대해서 이해할 수 있는 기회도 얻었고, 동시에 조금 더 보람찬 개발을 할 수 있지 있었습니다. 포스팅의 제목처럼, "Vuex 의 상태 값의 변화를 감지해서, data에 반영하는 방법"이란? computed: { changedParams: function () { const params =.. 2020. 11. 6. 마틴 파울러의 UnitTest 이해하기 - 번역본 원본 사이트 - martinfowler.com/bliki/UnitTest.html bliki: UnitTest Unit Tests are focused on small parts of a code-base, defined in regular programming tools, and fast. There is disagreement on whether units should be solitary or sociable. martinfowler.com 단위 테스트는 소프트웨어 개발에서 자주 언급되며 프로그램을 작성하는 동안 제가 익숙한 용어입니다. 그러나 대부분의 소프트웨어 개발 용어와 마찬가지로 매우 잘못 정의되어 있으며 사람들이 실제보다 더 엄격하게 정의되었다고 생각할 때 종종 혼동이 발생할 수 있습니다... 2020. 10. 18. 기본 타입에 대한 강박관념(primitive Obsession) 에 대한 이해 Photo by Miguel Bruna on Unsplash 리팩토링에 있는 책의 일부분을 저의 의견과 함께 발췌하여 적었습니다. 들어가기 "기본타입에 대한 강박관념" 이라는 개념은 객체를 처음 접하는 경우, 작은 특정 객체를 사용하는 것을 피하고 Primitive Type 만을 사용하려 하는 경향을 말합니다. 여기서 말하는 작은 특정 객체의 사용의 주요 장점은 기본 타입 클래스와 응용 클래스 간의 경계를 허문다는 점 에 있습니다. 그럼 작은 특정 객체라는 것은 어떻게 만드는 걸까? 우리는 이를 더 명시적이고 정확하게 표현하기 위해 행해져야 합니다. 가장 먼저 볼 것은, 데이터 값을 객체로 전환(Replace Data Value With Object) 데이터 항목에 데이터나 기능을 더 추가해야 할 때는 .. 2020. 9. 27. 알아야만 하는 Java.time API 총 정리[실무&고급편] 1. 날짜와 시간 조작하기 1.1. 날짜와 시간을 더하거나 빼는 메소드 LocalDate, LocalDateTime, ZonedDateTime 클래스는 각각 년, 월, 일, 주를 더하거나 뺄 수 있습니다. LocalDateTime currentDateTime = LocalDateTime.now(); LocalDateTime targetDateTime = currentDateTime .plusYears(long) // 년도 더하기 .minusYears(long) // 년도 빼기 .plusMonths(long) // 월 더하기 .minusMonths(long) // 월 빼기 .plusDays(long) // 일 더하기 .minusDays(long) // 일 빼기 .plusWeeks(long) // 주 더하기.. 2020. 9. 20. 알아야만 하는 Java.time API 총 정리[기본편] 들어가기 개발을 하다보면, 언젠간 마주치게 되는 날짜 관련 API. 자바의 경우 날짜 관련된 검색(ex, 7월의 한달은 몃일까?)을 하면 이전에 자바8 이전의 데이터가 비교적 많이 검색됩니다. 또한 Java 8에서 제공해주는 LocalDateTime 관련 API 를 사용하더라고, 그 라이브러리를 잘 모르니까 때문에 언젠간 한번 쯤 정리가 필요하다고 느꼈습니다. 이 포스팅 시리즈는 LocalDate, LocalTime 다 쓸 수 있다고 자부하더라도, Temporal 이 무엇인지 몰라서 헤매는 저같은 사람에게 꼭 필요합니다. 다음 포스팅으로 알아야만 하는 Java.time API 총 정리[실무&고급편] 추가했습니다. 0.LoadMap 기본편에서는 LocalDate, LocalTime, Instant, Dur.. 2020. 9. 20. 자바의 리플렉션(Reflection)을 코드와 함께 이해하기 Photo by Maria Teneva on Unsplash 리플렉션 이해하기 해당 세미나는 외부교육으로 들은 더자바를 수강하고 시작하는 강의입니다. 우리의 최종 목표는 Spring에서 사용되는 DI의 동작원리를 이해하는 것입니다. 내용에 나오는 코드는 여기에서 좀 더 자세히 보실 수 있습니다. 1. 스프링의 Depedency Injection은 어떻게 동작할까? spring init 으로 프로젝트 만들기 book, bookSerivce, bookRepository 생성후 DI 하기. 2. 리플렉션 API - 클래스 정보 조회 Branch> 01-reflection-api-클래스-정보-조회 리플렉션의 시작은 Class https://docs.oracle.com/javase/8/docs/api/java/l.. 2020. 9. 16. 자바의 직렬화(serialization)를 코드와 함께 이해하기 Photo by Casey Horner on Unsplash 회사 사내세미나를 했던 자료를 옮겨왔습니다. 자세한 소스코드는 여기를 참고해주세요. 1. 직렬화란 무엇일까요? serialization (or serialisation) is the process of translating data structures or object state into a format that can be stored (for example, in a file or memory buffer) or transmitted (for example, across a network connection link) and reconstructed later (possibly in a different computer environment.. 2020. 9. 16. build.gradle 에서 다양한 방식으로 변수 사용하기. 들어가기 다양한 방법들 build.gradle 에서 변수를 사용하는 방식은 아래와 같습니다. 사실 위 System.xxx 의 경우 gradle에서 제공하기 보다는 Java에서 제공한다는 말이 맞습니다. 그러나 제목과 같이 build.gradle 에서 사용하는 방법이므로, 포함시키겠습니다. task printTask(){ println(System.getenv("X_USER")) println(project.getProperties()["X_USER"]) println(System.getProperty("X_USER")) } > "xxx" ./gradlew printTask "xxx" 여기서 xxx 하는 것에 따라서 변수를 다르게 넣을 수 있습니다. System.getenv("X-USER") // 시스템의.. 2020. 9. 4. 이전 1 2 다음