728x90
- 알고리즘 문제 풀기
프로그래머스의 'JadenCase 문자열 만들기' 문제를 풀었다.
처음에는 split으로 공백 기준으로 문자열을 나눈 뒤 각 단어의 첫 글자를 isUpperCase()로 대문자로 만들었다.
그런데 문제의 조건에 공백이 여러 개 있을 수 있다고 되어있어서
문자열의 문자를 하나씩 검토하는 방식으로 바꿔야곘다는 생각이 들어 수정했다.
나는 문자열의 문자 하나씩 조회하면서 공백 다음 문자인지 flag를 통해 확인하였다.
문제를 풀고 난 뒤 다른 사람의 풀이를 확인했더니 문자열을 문자 하나씩 검사하는 것이 아니라
split을 이용해 각 문자 1개로 이루어진 문자열들의 배열로 만드는 방식을 사용했다.
split("")과 같이 사용하는 것은 처음 봐서 놀랐고
문자열 배열로 만들어 하나씩 검사하니까 문자 <-> 문자열로 변환하는 과정을 거치지 않아서 코드가 단순해졌다.
그렇지만 내가 작성한 풀이 방법이 원시타입을 사용해서 그런지 걸리는 시간이 더 적었다.
아무튼 처음 보는 방식이었기 때문에 기록해두면 좋을 것 같다.
나의 풀이
public static String solution(String s) {
s = s.toLowerCase();
StringBuilder answer = new StringBuilder();
int flag = 1;
for(int i=0;i<s.length();i++){
char c = s.charAt(i);
if(flag == 1 && (c >= 'a' && c <= 'z')){
answer.append((char)(c - 'a' + 'A'));
flag = 0;
}
else{
answer.append(c);
}
if(c == ' ') flag = 1;
else flag =0;
}
return answer.toString();
}
다른 사람의 풀이
class Solution {
public String solution(String s) {
String answer = "";
String[] sp = s.toLowerCase().split("");
boolean flag = true;
for(String ss : sp) {
answer += flag ? ss.toUpperCase() : ss;
flag = ss.equals(" ") ? true : false;
}
return answer;
}
}
- 스탠다드반 자율 과제
학습 과제
- WAS(Tomcat), Servlet, JDBC란?
- WAS: DB처리나 로직 처리를 요구하는 동적인 컨텐츠를 제공하는 서버
- Tomcat: Java 기반의 서블릿 컨테이너이자 웹 서버
- Apache Tomcat: Apache + Tomcat. 정적인 데이터 처리와 동적인 데이터 처리를 효율적으로
- Apache Tomcat을 직접 다운로드 받고 프로젝트에 삽입했어야 하는 Spring 프레임워크와 달리 SpringBoot는 기본적으로 starter-web dependency를 설정하면 자동으로 내장형 Apache Tomcat 제공
- Servlet: 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램
- 클라이언트의 요청을 처리하고 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술
- 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 다룰 수 있게 해줌
- Spring은 DispatcherServlet을 사용하여 Front Controller 패턴 방식으로 API 요청을 효율적으로 처리
- 서블릿 컨테이너: 서블릿들의 생성, 실행, 파괴를 담당
- JDBC: Java Database Connectivity로 DB에 접근할 수 있도록 Java에서 제공하는 API
- 연결해야하는 DB의 JDBC 드라이버를 제공하면 DB 연결 로직을 변경할 필요 없이 DB 변경 가능
- 각 DB에 맞도록 JDBC 인터페이스를 구현해 라이브러리로 제공하는데 이를 JDBC 드라이버라고 함
- JdbcTemplate: 커넥션 연결, statement 준비 및 실행, 커넥션 종료 등의 반복적이고 중복되는 작업들을 대신 처리해줌
- JDBCTemplate, QueryMapper(MyBatis), ORM(JPA) 각각의 장단점
- Application Layer에서 Database Layer에 접근하는 3가지 방법임
- JDBCTemplate
- 장점
- 반복문제 해결: JDBC를 사용할 때 발생하는 대부분의 반복작업을 처리해줌
- 설정의 편리함: build.gradle에 추가만 하면 사용 가능
- 단점
- 동적 SQL을 처리하기 어려움 -> MyBatis / Query DSL을 이용해서 처리
- 쿼리를 변경, 추가하기 위해 소스코드를 변경시켜야 함 (유지보수에 좋지 않음)
- 장점
- QueryMapper(MyBatis)
- Spring과 관계없는 Data Access Layer에 속하는 프레임워크
- 장점
- DAO 또는 소스코드로부터 쿼리를 분리
- 쿼리를 추가/삭제할 때 애플리케이션 코드를 새로 컴파일할 필요가 없고 유지보수가 쉬워짐
- 다양한 프로그래밍 언어로 구현이 가능
- 학습하기 쉬움
- 동적쿼리 작성에 좋음
- 단점
- 쿼리 결과를 객체 지향적으로 사용할 수 없음
- 스키마 변경시 SQL 쿼리를 직접 수정해야 함
- 데이터베이스 변경시 로직도 함께 수정해야 함(DB에 종속적)
- 유지보수 및 테스트가 어려움
- ORM(JPA)
- 장점
- SQL에 의존적이지 않음(쿼리를 직접 작성할 필요가 없음) - 객체 중심으로 생산적인 개발이 가능
- 객체와 RDB의 패러다임 불일치 해결
- 가독성이 좋음
- 동일한 쿼리에 대한 캐시 기능을 사용
- 단점
- 매핑 설계를 잘못했을 때 성능저하 발생
- 학습 시간이 오래 걸림
- 다수 테이블 조인시 신경써야 할게 많음
- 장점
- Prepared Statement와 Statement의 차이
- Statement
- 쿼리문을 수행할 때마다 쿼리 문장 분석 -> 컴파일 -> 실행 과정을 거침
- 매번 컴파일을 하기 때문에 성능상 이슈 발생
- 실행되는 SQL문을 확인 가능
- Prepared Statement
- 컴파일이 미리 되어있기 때문에 더 좋은 성능
- 특수문자를 자동으로 파싱해주기 때문에 SQL injection 같은 공격을 막을 수 있음
- "?" 부분에만 변화를 주어 쿼리문을 수행하므로 실행되는 SQL문을 파악하기 어려움
- 처음에만 쿼리 문장 분석 -> 컴파일 -> 실행 과정을 거친 후 캐시에 담아 재사용함
- 동일한 쿼리를 반복 수행하는 경우 적은 부하를 주며 성능도 좋음
- 사용자 입력값으로 쿼리문을 실행해야 하는 경우 사용
- Statement
- 통합 테스트, 단위 테스트
- 단위 테스트
- 가장 작은 기능적 단위, 일반적으로 클래스 또는 메소드를 실행하여 예상대로 동작하는지 확인하는 테스트
- 단위의 크기가 작을수록 복잡성이 낮아지고 동작을 표현하기 쉬워짐
- 통합 테스트
- 여러 모듈간의 상호작용과 조정을 검증하는데 중점을 둔 소프트웨어 테스팅
- 유닛들이 결합되었을 때 올바르게 작동하는지 확인
- 단위 테스트
- Spring이 나오게 된 이유, Spring Boot가 나오게 된 이유
- 스프링의 등장 배경
- 상업용 웹 애플리케이션 개발을 돕기 위한 EJB(Enterprise Java Bean) 등장
- EJB의 단점: 어려운 테스트/배포, 객체지향 디자인의 방해요소, 간단한 작업의 불필요한 난이도 상승, 제한적 WAS 선택
- 스프링 프레임워크 -> POJO(Plain Old Java Object) 모델 채택: 특정 프레임워크나 컨테이너에 대한 종속성없이 객체를 관리할 수 있는 컨테이너를 제공
- 스프링부트의 등장 배경
- JavaScript의 Node.js나 Python의 Djange와 같이 빠르게 웹 애플리케이션을 개발하고 배포할 수 있는 경량 프레임워크들에 비해 스프링은 사용할 라이브러리들을 채택하고 호환성을 따져야 했음
- 자동 설정을 통해 빠르게 스프링 기반 애플리케이션 개발을 시작할 수 있도록 도와주는 도구
- Containerless: 서블릿 컨테이너에 대한 준비를 직접하지 않아도 되는 방식
- Opinionated:스프링부트 스스로 사용할 도구를 선택하고 기본적인 구성을 세팅. 필요한 빈들을 자동 구성.
- 일단 정해주는 대로 만들고 개발자가 원하는 부분만 직접 바꾸도록 함
- 스프링의 등장 배경
- 객체지향 프로그래밍의 장단점
- 객체지향 프로그래밍: 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법
- 장점
- 코드 재사용이 용이
- 유지보수가 쉬움
- 대형 프로젝트에 적합
- 직관적인 코드 분석이 가능
- 신뢰성 높은 프로그래밍이 가능
- 단점
- 처리속도가 상대적으로 느림
- 객체가 많으면 용량이 커질 수 있음
- 설계시 많은 시간과 노력이 필요
'TIL' 카테고리의 다른 글
[231113] Spring 입문 개인과제 해설 (0) | 2023.11.13 |
---|---|
[231109] Java 배열과 ArrayList (0) | 2023.11.09 |
[231103] Spring 개인과제 (0) | 2023.11.03 |
[231102] 배열을 리스트로, 스프링 bean과 싱글톤 패턴 (0) | 2023.11.02 |
[231101] 스트림을 배열로 변환, POST와 GET의 차이 (0) | 2023.11.01 |