반응형

분류 전체보기 60

Spring Boot 콘솔 애플리케이션에서 H2 인메모리 데이터베이스를 TCP 서버 모드로 설정하는 방법

) -->✅ Spring Boot 콘솔 프로젝트에서 H2 DB를 TCP 서버 모드로 설정하는 이유Spring 웹 애플리케이션에서 H2 인메모리 DB를 사용하는것과 마찬가지로 Spring Boot로 콘솔 기반 프로젝트에서도 H2 DB를 이용할 수 있는데요.그런데 Spring 웹 애플리케이션에서 H2를 사용할 때처럼 콘솔 프로젝트에도 동일한 방식으로 사용할 수 있다라고 생각하기 쉬운데 웹 애플리케이션과 콘솔 애플리케이션은 구조적으로 동작 방식이 다릅니다. 🔍 웹 애플리케이션 vs 콘솔 애플리케이션의 차이점구분Spring 웹 애플리케이션Spring 콘솔 애플리케이션실행 방식서버로 실행됨 (8080 등에서 계속 대기)메인 메서드 실행 후 바로 종료H2 DB 유지실행 중엔 메모리 DB 유지 가능애플리케이션 종료..

[4편] 1부 이후, 2부에선 어떤 걸 배우게 될까?

“작은 프로젝트 세 개를 해보니, 이제 조금은 애플리케이션 구현에 자신감이 생겼습니다. 그런데 그다음엔 뭘 해야 하죠?”1부 강의를 끝낸 분들이 종종 묻는 질문입니다.그리고 이 질문이 나오는 순간, “이제부터가 진짜구나”라는 답을 드리고 싶어요.🚪 1부는 입문, 2부는 확장입니다1부에서 우리는콘솔 기반의 작은 프로젝트를 통해설계 → 구현 → 검증이라는 사이클을직접 여러 번 반복해 봤습니다.그 과정에서 “어떻게 나눌까?”, “이건 어떤 책임이지?”이런 객체지향적 질문들을 훈련했죠.하지만 현실에서의 프로젝트는이보다 조금 더 복잡하고, 더 유연한 구조를 요구합니다.그걸 경험해 보는 게 바로 2부의 목표입니다.🧱 2부에서 바뀌는 것들✅ 프로젝트의 성격이 달라집니다1부: 기능 중심 / 단순한 구조2부: 실제 ..

[3편] 강의 방식: 스스로 만들고, 비교하며 성장하기

“이거 정답(레퍼런스) 코드 주시는 건가요?”학생들을 가르치다 보면 강의 초반에 많이 듣는 질문 중 하나입니다.당연히 정답(레퍼런스) 코드가 있겠지만 이 강의의 목표는 ‘정답 코드’를 주는 것이 아니라,자신이 작성한 코드와 강사가 작성한 코드 중에서 더 나은 코드를 도출해 ‘자신만의 코드’를 만들 수 있는 사고력을 기르는 것에 있습니다.🧠 직접 해보는 것만큼 강력한 학습은 없다Java에 대한 문법은 책이나 온라인 강의로도 배울 수 있고,좋은 코드는 인터넷에도 많습니다.하지만 그걸 스스로 처음부터 구현해 보는 경험은완전히 다른 차원의 학습입니다.어떤 클래스를 만들지어떤 책임을 나눌지어떤 흐름으로 동작시킬지이걸 직접 고민하면서 만들어보는 경험은그 사람만의 사고 구조를 만듭니다.💥 그다음, 비교가 시작됩니..

[2편] 작은 프로젝트에서 배우는 객체지향

“객체지향이 중요하대서 이론은 공부했는데...막상 어떻게 적용해야 할지 모르겠어요.”Java를 공부한 입문자들에게 가장 많이 듣는 이야기입니다.책을 보고 개념은 어느 정도 이해했는데,직접 객체지향으로 무언가를 만들어본 경험은 거의 없다는 거죠.🎯 객체지향은 '이해'보다 '적용'이 어렵다추상화, 캡슐화, 상속, 다형성…책으로 보면 뭔가 멋져 보이는데막상 프로젝트에 쓰려고 하면 어디에 써야 할지 막막하죠.특히 작은 프로젝트를 만들다 보면“굳이 클래스를 나눠야 해?”, “이걸 인터페이스로 만드는 게 맞아?”같은 고민에 빠지게 됩니다.그런데 바로 이런 혼란과 시행착오 과정이진짜 객체지향을 습득하게 해주는 가장 좋은 기회입니다.🛠 작은 프로젝트 = 객체지향 훈련장작은 콘솔 프로젝트라도역할 분리 → 책임 분리 ..

[1편] 왜 구현이 막막할까? – Java 입문자의 고민

“Java 문법은 이제 대충 알겠는데 구현이 너무 어렵습니다.”Java 입문자를 대상으로 강의를 하다 보면, 정말 자주 듣는 말입니다.심지어 객체지향이나 상속, 캡슐화 같은 개념도 알고 있어요.그런데 막상 “작은 애플리케이션 하나 구현해 보세요” 하면, 손이 멈춰버립니다.📌 익숙하지만 낯선 그 순간Java는 분명히 익숙해졌는데,“뭐부터 해야하지?” , “어떤 클래스부터 만들지?”, “이걸 어떻게 나눠야 하지?”이런 질문 앞에서 멈칫하게 됩니다.이런 상황이 오는 이유는 단순히 ‘공부가 부족해서’가 아닙니다.오히려 문법 위주로만 학습해 왔기 때문이죠.클래스는 만들 수 있지만,“왜” 만드는지, “어떻게 역할을 나누는지”,이런 설계적 사고가 없으면 구현은 늘 막막합니다.💭 제자들의 사례제가 부트캠프나 인프런..

[0편] “Java 문법은 아는데 구현이 막막해요” – 그럴 땐 이렇게 했습니다

Java 프로젝트가 막막할 때, 작게 시작해 보세요“Java 문법은 배웠는데, 직접 무언가를 구현하려니까 너무 막막했어요.” 이런 고민, 한 번쯤 해보셨나요? Java는 분명 문법도 많고, 클래스나 인터페이스 같은 개념도 어렵죠. 그래서 학원이나 부트캠프를 수료하고도 “이제 뭘 만들어야 하지?” 라며 길을 잃기 쉬운데요. Spring 전에, 작고 단단한 구현 경험이 필요합니다많은 입문자들이 Java를 배운 뒤 곧바로 Spring으로 넘어가지만, 막상 프로젝트 구현을 시작하려면 손이 안 움직이는 경우가 많습니다. 그 이유는 간단합니다. “코드를 직접 구조화해서 만들면서 익힌 적이 없기 때문”입니다.이 강의는 그런 분들을 위해 만들어졌습니다.✔️ 설계 ✔️ 구현 ✔️ 테스트 ✔️ 리팩토링 이 모든 단계를 직..

Java Stream API 한방에 이해하기

Java의 Stream은 위에서 아래로 흐르는 시냇물이다프로그래밍에서 데이터를 처리할 때, 우리는 보통 for 문을 이용한 반복문을 먼저 떠올립니다.하지만 Java 8부터 등장한 Stream API는 완전히 다른 방식으로 데이터를 다루게 해줍니다.Stream은 마치 위에서 아래로 흐르는 시냇물처럼컬렉션(List, Set 등)의 데이터를 흘려보내며필터링하고, 가공하고, 집계하는 도구입니다.예를 들어 볼까요?👉 코드 스니핏 (Java):List names = List.of("kevin", "tom", "emma");names.stream() .filter(name -> name.length() >= 5) .map(String::toUpperCase) .forEach(System.out::p..

JwtAuthorizationFilter에 try ~ catch 문이 있고, 없고의 차이

Spring Security 기반의 애플리케이션에 아이디/패스워드 로그인 인증 후, 전달 받은 JWT를 이용해 서버 측 리소스에 접근한다고 가정해 봅시다.이 경우, 매 요청마다 JWT를 request header에 포함해서 요청 전송을 할텐데요.이 JWT를 JwtAuthorizationFilter가 검증할 경우, 두 가지 케이스를 테스트 해 보았습니다. JwtAuthorizationFilter에서 인증이나 접근 권한 등의 예외를 try ~ catch로 잡는 경우public class JwtVerificationFilter extends OncePerRequestFilter { private final JwtTokenizer jwtTokenizer; private final CustomAutho..

ObjectMapper를 이용한 JSON 역직렬화(Deserialization) 이야기

Spring MVC에서 ObjectMapper로 json 포맷의 request body를 DTO 객체로 역직렬화 하는 방법은 크게 두 가지이다. 디폴트 생성자가 있을 경우, 이 경우는 다음과 같은 순서를 따라 역직렬화를 수행한다. 역직렬화의 시작점은 BeanDeserializer이다. BeanDeserializer.deserializeFromObject()에서 디폴트 생성자를 이용한 리플렉션 기법(Constructor.newInstance(Object[] args)으로 DTO 객체를 생성한다. FieldProperty.deserializeAndSet(...)에서 리플렉션으로 얻어온 Field에 JSON 포맷에서 얻은 값을 set한다. 여기서의 Field는 DTO 객체의 멤버 필드의 메타 정보를 포함한 객..

Reactor Sequence에서 발생하는 signal의 전파 흐름

이번 시간에는 Reactor Sequence 상에서 발생하는 signal의 전파 흐름을 알아보도록 하겠습니다. 일반적인 Signal의 전파 흐름 1 2 3 4 5 6 7 8 9 10 11 12 13 import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; @Slf4j public class ReactorSignalEventPropagationExample01 { public static void main(String[] args) { Flux .range(1, 1) .filter(n -> n > 0) .map(n -> n * 2) .subscribe(data -> log.info("# onNext: {}", data)); } } 코드 1..

반응형