1. - 한 개의 문자열을 입력받고, 특정 문자를 입력받아 해당 특정문자가 입력받은 문자열에 몇 개 존재하는지 알아내는 프로그램 작성 - 대소문자 구분 x - 첫 줄에 문자열이 주어지고, 두 번째 줄에 문자가 주어진다 - 문자열은 영어 알파벳으로만 구성 import java.util.Scanner; public class Main { public static int solution(String str, char c){ int answer = 0; str = str.toUpperCase(); c = Character.toUpperCase(c); System.out.println("str : " +str); System.out.println("c : "+ c); /*for(int i=0;iminVal){ m..
올해 3월에 끝났던 독서 스터디 할 때마다 대강 기억에 남았던 것들 정리해서 저장만 해놨던 건데 드디어 정리한다 가상 면접 사례로 배우는 대규모 시스템 설계 기초 / w. 알렉스 쉬 1장 사용자 수에 따른 규모 확장성 - 로드밸런서 : 부하 분산 집합에 속한 웹 서버들에게 트래픽 부하를 고르게 분산하는 역할(6p) - CDN(콘텐츠 전송 네트워크) : 이미지 비디오 CSS JavaScript 파일 등을 캐시. 정적 콘텐츠는 CDN을 통해 서비스 - 무상태(stateless) 웹 계층(17p) - 메세지 큐 : 메시지의 무손실 즉, 메시지 큐에 보관된 메시지는 소비자가 꺼낼 때까지 안전히 보관된다는 특성을 보장하는 비동기 통신을 지원하는 컴포넌트 - 샤딩 : 대규모 데이터베이스를 샤드라고 부르는 작은 단위..
Every derived table must have its own alias 문장 그대로 서브쿼리 사용시 alias를 주지 않아 발생하는 에러다. 간단한 오류인데 서브쿼리를 두개 이상씩 사용하게되면 마지막 서브쿼리에 자꾸 alias 빼먹어버려서 자주 보는거 같다. 좀 찾아보니까 오라클을 사용할 경우에는 alias가 없어도 정상적으로 동작하자만, Mysql은 필수적으로 적어줘야 된다고 한다 이렇게 서브쿼리 뒤에 alias가 없으면 오류 alias를 붙여주면 정상적으로 작동
로깅 라이브러링 - 스브링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리(spring-boot-starter-logging)가 함께 포함되고, 이는 기본적으로 SLF4J와 Logback를 사용한다. 지금 보니까 log4j 포함되어 있다 * 로그 라이브러리는 Logback, Log4J, Log4J2 등등 수 많은 라이브러리가 있는데, 그것을 통합해서 인터페이스로 제공하는 것이 바로 SLF4J 라이브러리다 쉽게 이야기해서 SLF4J는 인터페이스, 그 구현체로 Logback 같은 로그 라이브러리를 선택하면 된다 (실무에서는 Logback 많이 쓴다함) package hello.springmvc.basic; import lombok.extern.slf4j.Slf4j; import org.slf4j.Lo..
15장 JUnit 들여다 보기 - 책에서 소개해주는 모듈은 문자열 비교 오류를 파악할 때 유용한 코드 ex) ABCDE와 ABXDE를 받아 로 반환 - 소스 흉내내면서 책에서 하라는대로 같이 수정해봤는데 되게 재미있었다 최종 ComparsionCompactor.java public class ComparisonCompactor { private static final String ELLIPSIS="..."; private static final String DELTA_END="]"; private static final String DELTA_START="["; private int contextLength; private String expected; private String actual; priva..
14장. 점진적인 개선 Args 클래스를 소개하며 초창기의 소스와 비교하며 점진적으로 개선되는 모습을 보여준다. 소스를 그냥 냅다 붙여넣기 해버려서 진짜 읽기 싫게 해놨다. 그냥 제일 앞에 잘 짜여졌다는 소스라도 따라 쳐보면서 이해하는게 빠르다. Args 구현 public static void main(String[] args) { try { Args arg = new Args(“l,p#,d*”, args); boolean logging = arg.getBoolean(‘l’); int port = arg.getInt(‘p’); String directory = arg.getString(‘d’); executeAppliocation(logging, port, directory); } catch (ArgsE..
13장 동시성 * 동시성? - 한 cpu안에서 동시에 여러 작업을 하는 것처럼 보이게 만드는 것처럼 보이게 만드는 것 1. 동시성이 필요한 이유 - 동시성은 결합을 없애는 전략이다. 즉, 무엇(what)과 언제(when)를 분리하는 전략 - 무엇과 언제를 분리하면 애플리케이션 구조와 효율이 극적으로 나아진다 - 구조적인 관점에서 프로그램은 거대한 루프 하나가 아니라 작은 협력 프로그램 여럿으로 보인다 2. 동시성에 대한 오해 - 동시성은 항상 성능을 높여준다 -> 동시성은 때로 성능을 높여준다 대기시간이 아주 길어 여러 스레드가 프로세서를 공유할 수 있거나, 여러 프로세서가 동시에 처리할 독립적인 계산이 충분히 많은 경우에만 성능이 높아진다 - 동시성을 구현해도 설계는 변하지 않는다 -> 단일 스레드 시..
10장 클래스 1. 클래스는 작아야 한다 - 173p- 176p 예제 확인 2. 단일 책임 원칙(Single Responsibility Principle) : 클래스나 모듈을 변경할 이유가 하나뿐이어야 한다 - 큰 클래스 몇 개가 아니라 작은 클래스 여럿으로 이뤄진 시스템이 더 바람직하다. - 작은 클래스는 각자 맡은 책임이 하나, 변경할 이유도 하나이며 다른 작은 클래스와 협력해 시스템에 필요한 동작을 수행한다 3. 응집도 -179p-184p 예제확인 4. 변경하기 쉬운 클래스 -186p-188p 예제확인 11장 시스템 전에 스프링 강을 들을 때, 관심사 분리에 대한 내용을 배웠던거랑 비슷한 내용 같다. 근데 책으로 보려니까 이해안가는 부분들이 좀 많아서 몇 번 더 읽어 봐야 될듯 1. 시스템 제작과 ..
7장 - 오류처리 1. 오류보다 예외를 사용하라 - 오류가 발생하면 예외를 던지는 편이 낫다. 호출자 코드가 더 깔끔해지기때문 2. ry-catch-finally문 부터 작성하라 3. 미확인 예외를 사용하라(내용이해안감) 4. 예외에 의미를 제공하라 5. 호출자를 고려해 예외 클래스를 정의하라 6. 정상 흐름을 정의하라 7. null을 반환하지마라 - null을 반환하는 코드는 일거리를 늘리고 호출자에게 문제를 떠넘기는 격 스쳐지나가는 null 반환하던 코드들,,,ㅠ 8. null을 전달하지 마라 - null을 반환하는거보다 더 나쁜 코드 8장. 경계 시스템에 들어가는 모든 소프트웨어를 직접 개발하는 경우는 드물다. 패키지를 사고, 오픈소스를 이용하고, 때로는 다른 팀이 제공하는 컴포넌트를 사용함 이러한..
Callable - Runnable과 유사하지만 작업의 결과를 받을 수 있다 (값을 return 할 수 있다) Future - 비동기적인 작업의 현재 상태를 조회하거나 결과를 가져올 수 있다 결과값 가져오기 get() import java.util.concurrent.*; public class App { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); Callable hello = () -> { Thread.sleep(2000L); return "Hel..
- Total
- Today
- Yesterday