Today's Codekata
// 문자열 다루기 기본
class Solution {
public boolean solution(String s) {
if (s.length() != 4 && s.length() != 6) {
return false;
}
try {
int number = Integer.parseInt(s);
return true;
} catch (NumberFormatException e) {
return false;
}
}
}
"문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다."
위 지문에서 처음에 아래 try문만으로 답에 도달했다고 생각했는데, 실패가 떠서 다시 읽어보고 생각해보니 문자열 s의 길이가 4 혹은 6이 아니면 false를 반환하는게 선행되어야했다. 4나 6일 때만 정수변환을 하도록 if문 안에 넣는 게 더 좋았을 것 같기도 하다. 그래도 정답에 도달한 방향이 다른 사람의 풀이와 흡사해서 만족스럽다.
// 행렬의 덧셈
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
int[][] answer = new int[arr1.length][arr1[0].length];
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[0].length; j++) {
answer[i][j] = arr1[i][j] + arr2[i][j];
}
}
return answer;
}
}
행렬을 사용하는 방식이나 행렬에서 인덱스 값을 어떤 식으로 줘서 값을 가져오는 지 배워볼 수 있었다.
// 직사각형 별찍기
class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
for (int i = 0; i < b; i++) {
for (int j = 0; j < a; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
오늘은 for문 안에 for문을 활용하는 방식을 많이 시도해보는 것 같다.
-- 12세 이하인 여자 환자 목록 출력하기
SELECT PT_NAME, PT_NO, GEND_CD, AGE,
CASE WHEN TLNO IS NULL THEN 'NONE'
ELSE TLNO END AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME
-- 인기있는 아이스크림
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID
-- 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기
SELECT CAR_TYPE,
COUNT(*) CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%통풍시트%'
OR OPTIONS LIKE '%열선시트%'
OR OPTIONS LIKE '%가죽시트%'
GROUP BY 1
ORDER BY 1
WHERE절에서 LIKE는 각 조건마다 반복적으로 사용해야 한다.
Today I Learned
프레임워크(Framework) vs 라이브러리(Library)
| 항목 | 프레임워크 | 라이브러리 |
| 정의 | 개발자가 정해진 틀(frame)에 따라 개발하도록 구조를 제공 | 필요한 기능을 자유롭게 가져다 쓰는 도구 모음 |
| 제어 흐름 | 프레임워크가 흐름을 제어 | 개발자가 흐름을 제어 |
| 사용 방식 | 전체적인 프로젝트 구조를 따르고, 규칙에 맞게 코딩해야 함 | 필요한 기능을 골라서 직접 가져와 쓰면 됨 |
| 장점 | 구조화된 개발, 테스트 환경, 보안 기능 제공, 커뮤니티 지원 | 생산성 향상, 안정성 확보, 반복 코드 줄이기 |
| 단점 | 복잡하고 학습곡선 높음, 자유도 낮음, 버전 호환 이슈 | 업데이트/지원 중단 및 충돌 가능성, 커스터마이징 어려움 |
| 비유 | 붕어빵 틀: 틀을 따라야지만 원하는 모양이 나옴 | 자동차 바퀴: 원하는 브랜드를 골라서 끼울 수 있음 |
Annotation (어노테이션)
코드에 메타데이터를 추가해 특정 의미나 동작을 부여하는 기능이다. (@AnnotationName 형태로 사용)
클래스, 메서드, 변수, 매개변수, 패키지 등 다양한 코드 요소에 적용할 수 있다.
컴파일러 또는 런타임에 특정 행동을 트리거한다. 즉, 컴파일/실행 시점에 자동으로 작동시킨다.
| 기본 어노테이션 | 설명 |
| @Override | 상위 클래스나 인터페이스의 메서드를 재정의할 때 사용 |
| @Deprecated | 더 이상 사용되지 않는 요소에 적용, 컴파일 경고 발생 |
| @SuppressWarnings | 컴파일러 경고를 억제함 (ex. 사용되지 않는 변수 무시 등) |
Lombok 라이브러리
어노테이션 기반 자동 코드 생성 라이브러리로 보일러 플레이트 코드를 줄여준다.
| 주요 어노테이션 | 역할 |
| @Getter, @Setter | 필드의 getter/setter 메서드 자동 생성 |
| @ToString | toString 메서드 자동 생성 |
| @EqualsAndHashCode | 객체 비교 및 해시 처리를 위한 메서드 생성 |
| @NoArgsConstructor | 매개변수 없는 생성자 생성 |
| @AllArgsConstructor | 모든 필드를 매개변수로 가지는 생성자 생성 |
| @RequiredArgsConstructor | final 필드만을 포함한 생성자 생성 |
| @Data | 위 5개 기능 (Getter, Setter, ToString, EqualsAndHashCode, RequiredArgsConstructor)을 한 번에 적용 |
| @Builder | 빌더 패턴을 통해 가독성 높고 유연한 객체 생성 가능 |
| @Slf4j | Logger 객체 생성, 로그 메시지 출력에 사용 |
Spring Framework
자바 기반 엔터프라이즈 애플리케이션 개발용 프레임워크
복잡한 서버 성능, 보안, 신뢰성을 프레임워크가 해결하고, 개발자는 비즈니스 로직에 집중하도록 돕기 위해 만들어졌다.
구성 요소를 유연하게 연결/관리할 수 있고, 오픈소스이며 모듈화되어 있어 특정 기능만 선택적 사용이 가능하다.
Java의 객체 지향 언어의 특징을 살려낸 프레임워크이다.
Spring Boot
Spring Framework를 기반으로 간편하고 신속하게 개발할 수 있도록 도와주는 도구이다.
자동 구성(Auto-configuration) 기능을 제공하여, 개발자가 비즈니스 로직에 집중할 수 있게 해준다.
spring-boot-starter-web을 빌드 관리 도구에 추가하면 웹 앱에 필요한 모든 종속성과 설정이 자동으로 구성된다.
| 항목 | Spring Framework | Spring Boot |
| 설정 복잡도 | 복잡함 | 단순화됨 |
| 서버 준비 | 외부 WAS 필요 | 내장 Tomcat 제공 |
| 목적 | 대규모 시스템의 유연한 구성 지원 | 빠른 개발/테스트 환경 구성에 적합 |
Gradle
Groovy 기반의 빌드 자동화 도구이다.
Java 스타일의 문법으로 스크립트 작성 → 빌드, 라이브러리 관리, 테스트, 배포 등 자동화 하여 수행한다.
plugins 블록 : 어떤 기능을 사용할지 정의
dependencies 블록 : 어떤 라이브러리를 사용할지 정의
repositories 블록 : 라이브러리를 어디서 받을지 명시
Java 웹 기술의 역사
| 시대 | 주요 기술 | 핵심 특징 |
| 1997 | Servlet | 요청-응답 처리 / 웹 개발의 시작점 / 코드 복잡 |
| 1999 | JSP | HTML에 Java 삽입 / 동적 페이지 생성 / 비즈니스 로직 분리 어려움 |
| 2000s 초반 | MVC 패턴 | Servlet=컨트롤러, JSP=뷰 / 유지보수 향상 / 설정 복잡 |
| 2000~2010 | MVC 프레임워크 (Struts, Spring MVC) | 구조화된 개발 / 자동 설정 / 여전히 복잡함 존재 |
| 2007~현재 | Annotation 기반 Spring MVC | 선언적 프로그래밍 / 설정 간소화 / 직관적인 개발 |
| 2014~현재 | Spring Boot | 내장 톰캣 / 빠른 프로젝트 시작 / 자동 설정 중심 |
※ 최신 동향 (Spring 기반 웹 기술)
Web Servlet - Spring MVC : 동기 방식의 안정적인 구조로 널리 사용 (실무에선 더 많이 사용된다.)
Web Reactive - Spring WebFlux : 비동기 + 넌블로킹 모델 기반, 함수형 스타일, 높은 동시성/실시간 데이터 처리에 적합
MVC 패턴
웹 애플리케이션을 Model(데이터), View(화면), Controller(요청 처리)로 분리하여 각 책임을 명확히 나누는 구조다.
이를 통해 유지보수와 확장성이 향상되며, UI 변경과 비즈니스 로직 수정을 서로 독립적으로 처리할 수 있다.
MVC 구성 요소
| 영역 | 역할 | 특징 |
| Model | View에 전달할 데이터를 저장 | DB 접근 X / 단순 데이터 포장 |
| View | 데이터를 기반으로 화면 그리기 | HTML + 템플릿 엔진 |
| Controller | 요청 처리 / 로직 실행 / 모델 구성 | 보통 Service 호출 / 검증 담당 |
발전 단계
| 단계 | 설명 | 문제점 |
| Servlet 사용 | 비즈니스와 View 혼합 | 코드 응집도 낮음 |
| JSP 도입 | View 분리 | 로직이 여전히 View에 있음 |
| MVC 패턴 | View/Model/Controller 분리 | 공통 처리 중복 |
| 프론트 컨트롤러 | 하나의 입구로 공통 처리 | 핸들러 응답 통일 필요 |
| 어댑터 패턴 도입 | 다양한 핸들러와 프론트 컨트롤러 연결 | 유연성 ↑, 책임 분리됨 |
| Spring MVC | 모든 구조를 통합한 현대적 방식 | 생산성과 유지보수성 뛰어남 |
개념들은 아직 낯설고 복잡하게 느껴지지만, 각각의 역할과 차이를 비교하면서 조금씩 이해해가고 있다.