<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ryan_jang.log</title>
        <link>https://velog.io/</link>
        <description>Newbie Engineer&amp;Programmer</description>
        <lastBuildDate>Thu, 18 Jan 2024 14:09:51 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ryan_jang.log</title>
            <url>https://velog.velcdn.com/images/ryan_jang/profile/15d345bc-db79-42c2-a22c-bd09fd1ffe20/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ryan_jang.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ryan_jang" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[240118 TIL 대용량 트래픽 문제와 ORM의 쿼리문제 ]]></title>
            <link>https://velog.io/@ryan_jang/240118-TIL-%EB%8C%80%EC%9A%A9%EB%9F%89-%ED%8A%B8%EB%9E%98%ED%94%BD-%EB%AC%B8%EC%A0%9C%EC%99%80-ORM%EC%9D%98-%EC%BF%BC%EB%A6%AC%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@ryan_jang/240118-TIL-%EB%8C%80%EC%9A%A9%EB%9F%89-%ED%8A%B8%EB%9E%98%ED%94%BD-%EB%AC%B8%EC%A0%9C%EC%99%80-ORM%EC%9D%98-%EC%BF%BC%EB%A6%AC%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Thu, 18 Jan 2024 14:09:51 GMT</pubDate>
            <description><![CDATA[<h2 id="대용량-트래픽-발생시-어떻게-대응하는가">대용량 트래픽 발생시 어떻게 대응하는가?</h2>
<p>대용량 트래픽에 대응하기 위해서는 Java Spring 애플리케이션을 최적화하고 확장 가능한 아키텍처를 구축하는 것이 중요. 아래는 대용량 트래픽에 대응하기 위한 몇 가지 주요 전략이다.</p>
<h3 id="1로드-밸런싱-load-balancing">1.로드 밸런싱 (Load Balancing):</h3>
<h4 id="개념-트래픽을-여러-서버로-분산시켜-부하를-분산하는-메커니즘">개념: 트래픽을 여러 서버로 분산시켜 부하를 분산하는 메커니즘.</h4>
<ul>
<li>Spring에서의 적용: Spring에서는 로드 밸런싱을 위해 여러 옵션을 제공함.</li>
<li>하드웨어 로드 밸런서, NGINX, 또는 Spring Cloud의 Ribbon과 같은 소프트웨어 로드 밸런서를 활용할 수 있다.</li>
</ul>
<h3 id="2-수평-확장-horizontal-scaling">2. 수평 확장 (Horizontal Scaling):</h3>
<h4 id="개념-서버의-대수를-늘려-시스템의-성능을-향상시키는-방법">개념: 서버의 대수를 늘려 시스템의 성능을 향상시키는 방법.</h4>
<ul>
<li>Spring에서의 적용: Spring Boot 애플리케이션을 여러 인스턴스로 실행하여 수평 확장을 구현할 수 있다.</li>
<li>Spring Cloud와 같은 기술을 사용하여 마이크로서비스 아키텍처를 통해 서비스를 분할하고 독립적으로 확장할 수 있다.</li>
</ul>
<h3 id="3-캐싱-caching">3. 캐싱 (Caching):</h3>
<h4 id="개념-자주-사용되는-데이터를-메모리에-저장하여-빠르게-응답할-수-있도록-하는-메커니즘">개념: 자주 사용되는 데이터를 메모리에 저장하여 빠르게 응답할 수 있도록 하는 메커니즘.</h4>
<ul>
<li>Spring에서의 적용: Spring Cache를 활용하여 메서드의 결과를 캐싱할 수 있다.</li>
<li>분산 캐싱 솔루션인 Redis 또는 Memcached를 통해 여러 인스턴스 간에 캐싱을 공유할 수 있다.</li>
</ul>
<h3 id="4-비동기-처리-asynchronous-processing">4. 비동기 처리 (Asynchronous Processing):</h3>
<h4 id="개념-일부-작업을-비동기로-처리하여-응답-시간을-최적화">개념: 일부 작업을 비동기로 처리하여 응답 시간을 최적화.</h4>
<ul>
<li>Spring에서의 적용: Spring에서는 @Async 어노테이션을 사용하여 메서드를 비동기적으로 실행할 수 있다.</li>
<li>메시지 큐를 통한 비동기 메시지 처리를 고려할 수 있다.</li>
</ul>
<h3 id="5-데이터베이스-최적화">5. 데이터베이스 최적화:</h3>
<h4 id="개념-데이터베이스-쿼리의-성능을-향상시켜-대용량-데이터-처리를-최적화">개념: 데이터베이스 쿼리의 성능을 향상시켜 대용량 데이터 처리를 최적화.</h4>
<ul>
<li>Spring에서의 적용: JPA의 성능 최적화 기능을 활용하거나, Hibernate의 캐시를 사용하여 데이터베이스 액세스를 최적화할 수 있다.</li>
</ul>
<h3 id="6-모니터링-및-로깅">6. 모니터링 및 로깅:</h3>
<h4 id="개념-시스템의-상태를-모니터링하고-로그를-통해-문제를-식별하는-것이-중요합니다">개념: 시스템의 상태를 모니터링하고 로그를 통해 문제를 식별하는 것이 중요합니다.</h4>
<ul>
<li>Spring에서의 적용: Spring Boot Actuator를 사용하여 애플리케이션의 상태를 확인하고, 로깅을 통해 성능 문제를 식별.
모니터링 도구나 APM(Aplication Performance Monitoring) 도구를 활용하여 시스템을 지속적으로 감시.</li>
</ul>
<h3 id="7-보안-및-ddos-대응">7. 보안 및 DDos 대응:</h3>
<h4 id="개념-대규모-트래픽을-처리할-때-보안을-강화하고-ddosdistributed-denial-of-service-공격에-대비합니다">개념: 대규모 트래픽을 처리할 때 보안을 강화하고 DDoS(Distributed Denial of Service) 공격에 대비합니다.</h4>
<ul>
<li>Spring에서의 적용: Spring Security를 사용하여 보안을 강화하고, WAF(Web Application Firewall)를 통해 DDoS 대응을 강화할 수 있다.</li>
</ul>
<h3 id="8-성능-튜닝과-프로파일링">8. 성능 튜닝과 프로파일링:</h3>
<h4 id="개념-애플리케이션의-성능을-지속적으로-모니터링하고-튜닝하여-최적화합니다">개념: 애플리케이션의 성능을 지속적으로 모니터링하고 튜닝하여 최적화합니다.</h4>
<ul>
<li>Spring에서의 적용: VisualVM, YourKit, JProfiler 등의 프로파일링 도구를 사용하여 애플리케이션의 성능을 분석하고 최적화.</li>
</ul>
<p>대용량 트래픽에 대응하기 위해서는 이러한 전략을 조합하여 안정적이고 확장 가능한 시스템을 구축해야 합니다. 이때, Spring의 다양한 기능과 모듈을 적절히 활용하여 대응할 수 있다.</p>
<h2 id="orm-사용시-쿼리의-복잡성-문제">ORM 사용시 쿼리의 복잡성 문제</h2>
<p>ORM(Object-Relational Mapping)을 사용하면 쿼리가 복잡해질 수 있다.
이러한 복잡성은 대부분은 성능, 가독성, 유지보수 등의 이유로 발생. Java Spring에서는 이러한 복잡한 쿼리에 대한 대응책으로 다양한 방법과 기술을 제공하고 있다.</p>
<h3 id="1-jpqljava-persistence-query-language-활용">1. JPQL(Java Persistence Query Language) 활용</h3>
<h4 id="개념-jpajava-persistence-api에서-제공하는-객체-지향적인-쿼리-언어로-엔티티-객체를-대상으로-쿼리를-작성">개념: JPA(Java Persistence API)에서 제공하는 객체 지향적인 쿼리 언어로, 엔티티 객체를 대상으로 쿼리를 작성.</h4>
<h4 id="장점">장점</h4>
<p>(1) 객체 지향적이며, 엔티티 객체를 대상으로 쿼리를 작성하므로 가독성이 높아짐.
(2) 엔티티 간의 관계를 쉽게 표현할 수 있다.</p>
<h3 id="2-querydsl-사용">2. QueryDSL 사용</h3>
<h4 id="개념-java로-작성된-유형-안전한-동적-쿼리를-생성하는-데-사용되는-라이브러리">개념: Java로 작성된 유형 안전한 동적 쿼리를 생성하는 데 사용되는 라이브러리.</h4>
<h4 id="장점-1">장점</h4>
<p>(1) 컴파일 시점에 타입 검사를 제공하여 런타임 에러를 방지.
(2) 코드 자동 완성 및 가독성이 향상.</p>
<h3 id="3-native-query-사용">3. Native Query 사용:</h3>
<h4 id="개념-jpa에서-제공하는-jpql이나-hql이-아닌-실제-sql-쿼리를-사용">개념: JPA에서 제공하는 JPQL이나 HQL이 아닌 실제 SQL 쿼리를 사용.</h4>
<h4 id="장점-2">장점</h4>
<p>(1) 복잡한 쿼리를 작성할 때 JPQL이나 HQL보다 더 효과적일 수 있다.
(2) 특정 데이터베이스에 최적화된 쿼리를 작성할 수 있다.</p>
<h3 id="4-캐싱-활용">4. 캐싱 활용</h3>
<h4 id="개념-쿼리-결과를-캐시하여-성능을-향상시키는-기술입니다">개념: 쿼리 결과를 캐시하여 성능을 향상시키는 기술입니다.</h4>
<h4 id="장점-3">장점</h4>
<p>(1) 반복적으로 실행되는 쿼리의 결과를 캐시하면 데이터베이스 부하를 줄일 수 있다.
(2) Spring에서는 @Cacheable 어노테이션을 통해 메서드의 결과를 캐싱할 수 있다.</p>
<h3 id="5-dto-사용">5. DTO 사용</h3>
<h4 id="개념-entity의-일부-속성만-필요한-경우-전체-엔티티를-조회하는-것이-아니라-dtodata-transfer-object로-필요한-데이터만-선택적으로-조회합니다">개념: Entity의 일부 속성만 필요한 경우, 전체 엔티티를 조회하는 것이 아니라 DTO(Data Transfer Object)로 필요한 데이터만 선택적으로 조회합니다.</h4>
<h4 id="장점-4">장점</h4>
<p>(1) 필요한 데이터만 전송하므로 네트워크 부하가 줄어듦.
(2) 데이터 전송 시에 필요한 컬럼만 조회하므로 성능이 향상.</p>
<h3 id="6-batch-처리-활용">6. Batch 처리 활용:</h3>
<h4 id="개념-대량의-데이터를-한-번에-처리하는-방법으로-복잡한-쿼리를-분할하여-작은-단위로-나눠-처리합니다">개념: 대량의 데이터를 한 번에 처리하는 방법으로, 복잡한 쿼리를 분할하여 작은 단위로 나눠 처리합니다.</h4>
<h4 id="장점-5">장점</h4>
<p>(1) 대용량 데이터를 효율적으로 처리할 수 있다.
(2) 트랜잭션 범위를 최소화하여 성능을 향상시킬 수 있다.</p>
<h3 id="7-프로시저-및-함수-사용">7. 프로시저 및 함수 사용:</h3>
<h4 id="개념-데이터베이스에-저장된-프로시저stored-procedure나-함수를-활용하여-복잡한-로직을-데이터베이스-측에서-처리합니다">개념: 데이터베이스에 저장된 프로시저(Stored Procedure)나 함수를 활용하여 복잡한 로직을 데이터베이스 측에서 처리합니다.</h4>
<h4 id="장점-6">장점</h4>
<p>(1) 데이터베이스의 기능을 최대한 활용하여 성능을 최적화할 수 있다.
(2) 미리 정의된 로직을 사용하여 논리적인 처리를 간소화할 수 있다.</p>
<h3 id="8-인덱스-최적화">8. 인덱스 최적화:</h3>
<h4 id="개념-적절한-인덱스를-사용하여-쿼리의-속도를-향상시키는-방법입니다">개념: 적절한 인덱스를 사용하여 쿼리의 속도를 향상시키는 방법입니다.</h4>
<h4 id="장점-7">장점</h4>
<p>(1) 데이터베이스 엔진이 효율적으로 데이터를 찾을 수 있어 쿼리 성능이 향상됨.
(2) 인덱스는 검색 및 정렬을 가속화하므로 대용량 테이블에서 유용함.</p>
<h4 id="주의사항">주의사항</h4>
<p>(1) 복잡한 쿼리가 필요한 경우, 성능을 고려하여 적절한 전략을 선택해야 함.
(2) JPA에서의 성능 최적화와 관련된 다양한 힌트를 사용하여 데이터베이스와의 상호작용을 조절할 수 있다.
(3) 개발 초기에는 가독성을 중시하고, 성능 문제가 발생하면 프로파일링 도구를 사용하여 병목 지점을 찾아 최적화함.
(4) 복잡한 쿼리에 대한 대응은 사용되는 기술, 애플리케이션의 특성, 성능 요구사항 등을 고려하여 적절한 방법을 선택하는 것이 중요함.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240112 2ndTIL :  DI/IoC와 객체지향 프로그래밍]]></title>
            <link>https://velog.io/@ryan_jang/240112-2ndTIL-DIIoC%EC%99%80-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</link>
            <guid>https://velog.io/@ryan_jang/240112-2ndTIL-DIIoC%EC%99%80-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</guid>
            <pubDate>Fri, 12 Jan 2024 06:32:22 GMT</pubDate>
            <description><![CDATA[<h2 id="diioc">DI/IoC</h2>
<h4 id="di와-ioc는-스프링-프레임워크의-핵심-원칙-중-하나로-객체-간의-결합도를-낮추고-코드의-유지-보수를-용이하게-만드는-데-중요한-역할을-한다">DI와 IoC는 스프링 프레임워크의 핵심 원칙 중 하나로, 객체 간의 결합도를 낮추고 코드의 유지 보수를 용이하게 만드는 데 중요한 역할을 한다.</h4>
<h3 id="iocinversion-of-control">IoC(Inversion of Control)</h3>
<ul>
<li>IoC는 &#39;제어의 역전&#39;이라는 뜻.</li>
<li>객체의 생성과 생명주기 관리를 개발자가 아닌 프레임워크가 담당하도록 하는 원칙.</li>
<li>일반적으로, 개발자는 객체를 직접 생성하고 관리하는 데 책임이 있으나, 스프링에서는 그 책임이 스프링 컨테이너에게 넘어감.</li>
<li>개발자는 비즈니스 로직에 집중할 수 있고, 객체 간의 의존성 관리는 스프링 컨테이너가 알아서 처리해줌.</li>
<li>이런 방식으로 코드의 결합도를 낮추고 확장성을 높일 수 있음.</li>
</ul>
<h3 id="didependency-injection">DI(Dependency Injection)</h3>
<ul>
<li>DI는 위의 IoC의 원칙을 구현하는 방법 중 하나.</li>
<li>DI는 &#39;의존성 주입&#39;이라는 뜻으로, 객체가 필요로 하는 의존성을 외부에서 주입하는 방식.</li>
<li>이를 통해 객체 간의 결합도를 더욱 낮출 수 있음.</li>
</ul>
<h5 id="ex-예를-들어-a-클래스가-b-클래스의-메소드를-사용하려면-일반적으로-a-클래스-내부에서-b-클래스의-객체를-생성해야-함-이-경우-a-클래스는-b-클래스에-강하게-의존-하지만-di-사용시-b-클래스의-객체는-외부에서-a-클래스에-주입---a-클래스가-b-클래스의-구체적인-구현에-의존하지-않게-됨">ex) 예를 들어, A 클래스가 B 클래스의 메소드를 사용하려면, 일반적으로 A 클래스 내부에서 B 클래스의 객체를 생성해야 함. 이 경우, A 클래스는 B 클래스에 강하게 의존! 하지만 DI 사용시, B 클래스의 객체는 외부에서 A 클래스에 주입 -&gt; A 클래스가 B 클래스의 구체적인 구현에 의존하지 않게 됨.</h5>
<h3 id="di방식의-종류">DI방식의 종류</h3>
<ul>
<li>스프링에서는 주로 세 가지 방식의 DI를 지원함 : 생성자 주입, 세터 주입, 필드 주입.</li>
<li>위의 DI들은 각각 적절한 상황에 따라 사용됨.</li>
</ul>
<p>이러한 IoC와 DI의 원칙 덕분에, 스프링에서의 유연하고 확장성 있는 애플리케이션 개발이 가능하다. 개발자는 구체적인 객체 생성과 관리에서 해방되어 비즈니스 로직에 집중할 수 있으며, 테스트와 유지 보수도 용이해진다.</p>
<h2 id="객체지향-프로그래밍">객체지향 프로그래밍</h2>
<ul>
<li>객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그래밍 패러다임 중 하나로, 프로그램을 객체들의 집합으로 보고 이들이 서로 상호작용하는 방식으로 설계하고 구현하는 방법.</li>
<li>객체는 상태(state)와 행동(behavior)을 가지며, 이는 각각 객체의 속성(attribute)과 메소드(method)로 표현됨.</li>
</ul>
<p>**&lt; 객체지향 프로그래밍의 핵심 원칙&gt;
**</p>
<ol>
<li><p><strong>캡슐화(Encapsulation)</strong>: 객체의 상태와 행동을 하나의 단위로 묶는 것. 객체의 상태는 private 접근 제어자를 통해 외부로부터 보호되며, 상태 변경은 메소드를 통해서만 가능케 함.</p>
</li>
<li><p><strong>상속(Inheritance)</strong>: 기존 클래스의 특성을 그대로 물려받아 새로운 클래스를 생성하는 것. 이를 통해 코드의 중복을 줄이고 재사용성을 높일 수 있음.</p>
</li>
<li><p><strong>다형성(Polymorphism)</strong>: 같은 타입이나 메소드에 대해 다양한 방식으로 동작을 수행할 수 있게 하는 것을 말합니다. 이를 통해 유연성과 확장성을 높일 수 있음.</p>
</li>
<li><p><strong>추상화(Abstraction)</strong>: 복잡성을 줄이고, 필요한 핵심 기능만을 표현하기 위해 객체의 공통적인 특성들을 추출하는 것.</p>
</li>
</ol>
<h4 id="자바-스프링에서는-위와-같은-객체지향-프로그래밍-원칙들이-깊게-적용되어-있다-그에-따른-예시는-아래와-같다">자바 스프링에서는 위와 같은 객체지향 프로그래밍 원칙들이 깊게 적용되어 있다. 그에 따른 예시는 아래와 같다.</h4>
<p>1) 캡슐화: 스프링의 Bean은 캡슐화 원칙을 따름. Bean의 내부 상태는 외부에서 직접 접근할 수 없고, Bean 제공 메소드를 통해서만 접근 및 변경이 가능.</p>
<p>2) 상속: 스프링은 상속을 통해 기능을 확장. 예를 들어, @Component, @Service, @Repository 등의 어노테이션은 모두 @Component를 상속받아 사용.</p>
<p>3) 다형성: 스프링은 다형성을 통해 유연성을 높임. 예를 들어, 스프링은 JdbcTemplate 클래스를 통해 다양한 데이터베이스 작업을 추상화하고, 실제 구현은 개발자가 선택한 데이터베이스에 따라 달라짐.</p>
<p>4) 추상화: 스프링은 복잡한 기술을 추상화하여 개발자가 보다 쉽게 사용할 수 있게 함. 예를 들어, 스프링의 JdbcTemplate는 JDBC의 복잡한 작업을 추상화하여, 개발자가 SQL 쿼리 실행에만 집중할 수 있게 도와줌.</p>
<h4 id="이렇게-객체지향-프로그래밍은-스프링에서-중요한-역할을-하며-이를-통해-개발자는-보다-유연하고-강력한-애플리케이션을-구축할-수-있다">이렇게 객체지향 프로그래밍은 스프링에서 중요한 역할을 하며, 이를 통해 개발자는 보다 유연하고 강력한 애플리케이션을 구축할 수 있다.</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[240112 1stTIL : TCP/UDP와 http 및 https]]></title>
            <link>https://velog.io/@ryan_jang/240112-TIL-TCPUDP%EC%99%80-http-%EB%B0%8F-https</link>
            <guid>https://velog.io/@ryan_jang/240112-TIL-TCPUDP%EC%99%80-http-%EB%B0%8F-https</guid>
            <pubDate>Fri, 12 Jan 2024 05:40:15 GMT</pubDate>
            <description><![CDATA[<h2 id="tcp-udp">TCP? UDP?</h2>
<h4 id="둘-다-인터넷-프로토콜-스위트의-핵심-프로토콜-중-하나로-네트워크-통신에서-데이터를-전송하는-방법을-정의함">둘 다 인터넷 프로토콜 스위트의 핵심 프로토콜 중 하나로, 네트워크 통신에서 데이터를 전송하는 방법을 정의함.</h4>
<h3 id="tcp-transmission-control-protocol">TCP (Transmission Control Protocol)</h3>
<ul>
<li>TCP는 연결 지향적인 프로토콜로, 데이터 전송을 시작하기 전에 먼저 두 시스템 간에 연결을 설정. 이는 &#39;3-way handshaking&#39; 과정으로 이루어지고, 순서는 다음과 같다:</li>
</ul>
<ol>
<li>클라이언트가 서버에게 SYN 패킷을 보내 연결 요청.</li>
<li>서버는 SYN 패킷을 받고, SYN과 ACK (Acknowledgement) 패킷을 동시에 클라이언트에게 전송.</li>
<li>클라이언트는 ACK 패킷을 서버에게 보내 연결을 확립.</li>
</ol>
<ul>
<li>TCP는 이런 방식으로 데이터의 순서와 신뢰성을 보장함. 패킷이 손실되면 재전송을 요청하고, 도착한 패킷의 순서가 바뀌었다면 원래의 순서대로 재배열함.</li>
</ul>
<h3 id="udp-user-datagram-protocol">UDP (User Datagram Protocol)</h3>
<ul>
<li>반면, UDP는 연결이 설정되지 않은 상태에서 데이터를 전송하는 비연결형 프로토콜.</li>
<li>이는 데이터를 빠르게 전송할 수 있는 장점이 있지만, 패킷의 도착 순서나 손실에 대한 보장이 없다.</li>
<li>따라서, 신뢰성이 중요한 애플리케이션보다는 실시간성이 중요한 서비스에서 주로 사용됨.</li>
</ul>
<p>자바 스프링에서는 TCP와 UDP 통신을 위해 java.net 패키지의 Socket과 DatagramSocket 클래스를 사용할 수 있다.</p>
<h4 id="tcp에는-socket과-serversocket-클래스를-udp에는-datagramsocket과-datagrampacket-클래스를-사용">TCP에는 Socket과 ServerSocket 클래스를, UDP에는 DatagramSocket과 DatagramPacket 클래스를 사용.</h4>
<p>이렇게 TCP와 UDP의 신뢰성 차이는 각 프로토콜의 특성과 그에 따른 처리 과정에서 비롯됨.
TCP는 데이터의 신뢰성을 보장하기 위해 연결 설정과 패킷 관리 과정을 거치지만, UDP는 이러한 과정 없이 빠르게 데이터를 전송함.</p>
<h2 id="http-https">http? https?</h2>
<h4 id="둘-다-웹-상에서-정보를-주고받는-프로토콜">둘 다 웹 상에서 정보를 주고받는 프로토콜.</h4>
<h3 id="http">http</h3>
<ul>
<li>HTTP는 클라이언트에서 서버로 요청을 보내고, 서버에서 클라이언트로 응답을 전달하는 방식으로 동작.</li>
<li>하지만 HTTP는 암호화되지 않은 상태로 데이터를 전송하기 때문에, 중간에서 데이터를 가로채거나 변조하는 것이 가능.</li>
</ul>
<h3 id="https">https</h3>
<ul>
<li>반면, HTTPS는 SSL(Secure Sockets Layer) 또는 그 후속인 TLS (Transport Layer Security) 프로토콜을 사용하여 통신 내용을 암호화함. 이로 인해 중간에서 데이터를 가로채더라도 내용을 알아볼 수 없음.</li>
</ul>
<h4 id="ssl인증서">SSL인증서?</h4>
<ul>
<li>SSL 인증서는 이러한 암호화된 통신을 가능하게 하는 도구.</li>
<li>데이터가 원본 그대로 전송되었는지 확인하는 역할.</li>
<li>인증서는 공개키 암호화 방식을 사용하는데, 이는 데이터를 암호화하는 키와 복호화하는 키가 서로 다른 방식.</li>
</ul>
<h4 id="ssl인증서-적용-과정">SSL인증서 적용 과정</h4>
<ol>
<li>서버는 공개키를 클라이언트에게 제공</li>
<li>클라이언트는 이를 이용해 데이터를 암호화하여 전송.</li>
<li>서버는 자신만이 가지고 있는 비밀키로 암호화된 데이터를 복호화합니다.</li>
</ol>
<ul>
<li><p>장점
I) 데이터의 기밀성: 중간에서 데이터를 가로채도 복호화할 수 없음.
II) 데이터의 무결성: 데이터가 전송 중에 변조되지 않았음을 보장.
III) 인증: 클라이언트는 SSL 인증서를 통해 서버의 신원을 확인할 수 있음.</p>
</li>
<li><p>단점
I) 처리 속도: 암호화와 복호화 과정으로 인해 HTTP에 비해 처리 속도가 느림.
II) 인증서 발급 및 관리: 인증서를 발급하고 유지하기 위한 비용과 노력이 필요.</p>
</li>
</ul>
<p>스프링 자바에서는 <code>HttpServlet</code> 클래스를 통해 HTTP 요청을 처리할 수 있고, <code>java.net.http.HttpClient</code> 클래스를 이용해 HTTP 또는 HTTPS 요청을 보낼 수 있다. 
단, HTTPS 설정을 위해서는 서버 설정에 SSL 인증서를 등록해야 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240110 TIL 브라우저 작동방식, 쿠키와 세션]]></title>
            <link>https://velog.io/@ryan_jang/240110-TIL-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EC%9E%91%EB%8F%99%EB%B0%A9%EC%8B%9D-%EC%BF%A0%ED%82%A4%EC%99%80-%EC%84%B8%EC%85%98</link>
            <guid>https://velog.io/@ryan_jang/240110-TIL-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EC%9E%91%EB%8F%99%EB%B0%A9%EC%8B%9D-%EC%BF%A0%ED%82%A4%EC%99%80-%EC%84%B8%EC%85%98</guid>
            <pubDate>Wed, 10 Jan 2024 02:46:42 GMT</pubDate>
            <description><![CDATA[<h2 id="브라우저의-작동방식">브라우저의 작동방식</h2>
<h3 id="프로세스">프로세스</h3>
<p><strong>1. 클라이언트 요청</strong>
브라우저에서 사용자가 웹 애플리케이션에 접속, 특정 URL을 요청.
이 요청은 HTTP 요청으로 전달.</p>
<p><strong>2. DispatcherServlet</strong>
DispatcherServlet은 Spring MVC 프레임워크에서 중앙 집중식 컨트롤러로 작동.
클라이언트의 요청을 받아들이고, 이를 처리하기 위해 다른 컴포넌트들과 상호작용함.</p>
<p><strong>3. HandlerMapping</strong>
HandlerMapping은 클라이언트 요청과 매핑된 컨트롤러(Handler)를 찾아줌.
요청된 URL에 해당하는 컨트롤러를 찾기 위해 등록된 매핑 정보를 참조함.</p>
<p><strong>4. Controller</strong>
컨트롤러는 클라이언트 요청을 처리하는 데 사용됨.
요청에 맞는 비즈니스 로직을 수행하고, 데이터를 처리한 후에는 결과를 반환.</p>
<p><strong>5. ViewResolver</strong>
ViewResolver는 컨트롤러가 반환한 논리적인 뷰 이름을 실제 뷰로 매핑해줌.
뷰 이름을 기반으로 실제 뷰 객체를 찾아주는 역할을 함.</p>
<p><strong>6. View</strong>
View는 클라이언트에게 보여질 결과 화면을 생성하는 역할.
주로 JSP, Thymeleaf 등의 템플릿 엔진을 사용하여 동적인 HTML을 생성.</p>
<p><strong>7. 클라이언트 응답</strong>
생성된 뷰는 HTML 형태로 렌더링되어 클라이언트에게 응답으로 전송됨.
브라우저는 이 응답을 받아서 화면에 표시함.</p>
<p>이러한 단계를 거쳐 Java Spring에서 브라우저의 작동 방식이 이루어짐. 이 과정을 통해 클라이언트의 요청을 처리하고, 그에 맞는 응답을 생성하여 브라우저에 전달함.</p>
<h2 id="쿠키와-세션">쿠키와 세션</h2>
<h3 id="쿠키cookie">쿠키(Cookie)</h3>
<ul>
<li>쿠키는 클라이언트(브라우저)에 저장되는 작은 텍스트 파일.</li>
<li>서버에서 클라이언트로 전송되어 클라이언트에 저장, 이후 해당 도메인의 요청에 함께 전송됨.</li>
<li>주로 사용자 인증, 세션 관리 등에 활용됨.</li>
<li>클라이언트가 요청을 보낼 때마다 쿠키는 자동으로 서버로 전송되어 서버에서 상태 정보를 유지함.</li>
</ul>
<h3 id="세션session">세션(Session)</h3>
<ul>
<li>세션은 서버 측에서 클라이언트의 상태 정보를 유지하기 위한 개념.</li>
<li>클라이언트가 서버에 접속하면 서버는 클라이언트에게 고유한 세션 ID를 부여함.</li>
<li>이후 클라이언트의 요청마다 세션 ID를 통해 클라이언트의 상태 정보를 식별하고 유지함.</li>
<li>세션은 일정 시간 동안 유지되며, 클라이언트가 브라우저를 닫거나 세션 만료 시간이 지나면 삭제됨.</li>
</ul>
<h3 id="무상태stateless">무상태(Stateless)</h3>
<ul>
<li>웹은 기본적으로 무상태 프로토콜인 HTTP를 기반으로 동작.</li>
<li>무상태란 클라이언트와 서버 간의 상태 정보를 유지하지 않는 것을 의미.</li>
<li>각각의 요청은 독립적으로 처리되며, 이전 요청과의 관계를 유지하지 않음.</li>
<li>이로 인해 매 요청마다 인증 정보를 전송해야 하는 등의 불편함이 발생.</li>
</ul>
<h3 id="쿠키와-세션-기술이-개발된-이유">쿠키와 세션 기술이 개발된 이유</h3>
<ul>
<li>쿠키와 세션은 무상태 프로토콜인 HTTP의 한계를 극복하기 위해 개발됨.</li>
<li>쿠키는 클라이언트 측에서 상태 정보를 유지, 세션은 서버 측에서 상태 정보를 유지하여 무상태 프로토콜의 단점을 보완.</li>
<li>클라이언트의 상태 정보를 쿠키를 통해 유지하고, 세션은 각 클라이언트의 상태 정보를 서버에 저장하여 필요할 때 참조함.</li>
</ul>
<p>이렇게 쿠키와 세션은 무상태 프로토콜인 HTTP의 한계를 극복하기 위해 개발된 개념이며, 각각 클라이언트와 서버에서 상태 정보를 유지하는 방식으로 동작.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240109 HTTP 메서드, CORS]]></title>
            <link>https://velog.io/@ryan_jang/240109-HTTP-%EB%A9%94%EC%84%9C%EB%93%9C-CORS</link>
            <guid>https://velog.io/@ryan_jang/240109-HTTP-%EB%A9%94%EC%84%9C%EB%93%9C-CORS</guid>
            <pubDate>Tue, 09 Jan 2024 07:26:28 GMT</pubDate>
            <description><![CDATA[<h3 id="http-메서드란">HTTP 메서드란?</h3>
<p>HTTP 메서드는 클라이언트와 서버 간에 통신할 때 사용되는 요청 방식을 나타내는 메서드로, Java Spring에서도 HTTP 메서드를 활용하여 웹 애플리케이션을 개발할 수 있다. 주요 HTTP 메서드는 GET, POST, PUT, PATCH, DELETE이며, 기타 메서드로는 HEAD, OPTIONS, CONNECT, TRACE가 있다.</p>
<h3 id="주요-메서드">주요 메서드</h3>
<h4 id="--get-리소스를-조회하기-위해-서버에-요청하는-메서드">- GET: 리소스를 조회하기 위해 서버에 요청하는 메서드</h4>
<ul>
<li>주로 데이터를 조회할 때 사용. 예를 들어, 게시글 목록을 조회하거나 상세 정보를 가져올 때 사용.<pre><code>@GetMapping(&quot;/resource&quot;)
public ResponseEntity&lt;Resource&gt; getResource() {
 // GET 요청 처리 로직
}</code></pre></li>
</ul>
<h4 id="--post-서버에-새로운-데이터를-생성하기-위해-요청하는-메서드">- POST: 서버에 새로운 데이터를 생성하기 위해 요청하는 메서드.</h4>
<ul>
<li>주로 데이터를 생성하거나 처리할 때 사용. 예를 들어, 새로운 게시글을 작성하거나 사용자 정보를 등록할 때 사용.<pre><code>@PostMapping(&quot;/resource&quot;)
public ResponseEntity&lt;Resource&gt; createResource(@RequestBody Resource resource) {
 // POST 요청 처리 로직
}</code></pre></li>
</ul>
<h4 id="--put-서버에-데이터를-전송하여-해당-리소스를-업데이트하는-메서드">- PUT: 서버에 데이터를 전송하여 해당 리소스를 업데이트하는 메서드</h4>
<ul>
<li>전체 리소스를 업데이트하는 경우에 사용. 예를 들어, 게시글 전체 내용을 수정할 때 사용.</li>
</ul>
<pre><code>@PutMapping(&quot;/resource/{id}&quot;)
public ResponseEntity&lt;Resource&gt; updateResource(@PathVariable Long id, @RequestBody Resource resource) {
    // PUT 요청 처리 로직
}</code></pre><h4 id="--patch-서버에-데이터를-부분적으로-업데이트하기-위해-요청하는-메서드">- PATCH: 서버에 데이터를 부분적으로 업데이트하기 위해 요청하는 메서드.</h4>
<ul>
<li>리소스의 일부분만 수정하는 경우에 사용. 예를 들어, 게시글의 일부 내용을 수정할 때 사용.<pre><code>@PatchMapping(&quot;/resource/{id}&quot;)
public ResponseEntity&lt;Resource&gt; partiallyUpdateResource(@PathVariable Long id, @RequestBody Map&lt;String, Object&gt; updates) {
 // PATCH 요청 처리 로직
}</code></pre></li>
</ul>
<h4 id="--delete-서버에서-리소스를-삭제하기-위해-요청하는-메서드">- DELETE: 서버에서 리소스를 삭제하기 위해 요청하는 메서드.</h4>
<ul>
<li>예를 들어, 게시글을 삭제할 때 사용.<pre><code>@DeleteMapping(&quot;/resource/{id}&quot;)
public ResponseEntity&lt;Void&gt; deleteResource(@PathVariable Long id) {
 // DELETE 요청 처리 로직
}</code></pre><h3 id="기타-메서드">기타 메서드</h3>
</li>
</ul>
<h4 id="--head-서버에서-특정-리소스에-대한-헤더-정보만을-요청하는-메서드-주로-리소스의-메타데이터를-확인하기-위해-사용">- HEAD: 서버에서 특정 리소스에 대한 헤더 정보만을 요청하는 메서드. 주로 리소스의 메타데이터를 확인하기 위해 사용.</h4>
<h4 id="--options-서버에서-특정-리소스에-대해-지원-가능한-http-메서드들을-요청하는-메서드-주로-corscross-origin-resource-sharing-정책을-확인하기-위해-사용">- OPTIONS: 서버에서 특정 리소스에 대해 지원 가능한 HTTP 메서드들을 요청하는 메서드. 주로 CORS(Cross-Origin Resource Sharing) 정책을 확인하기 위해 사용.</h4>
<h4 id="--connect-클라이언트와-서버-간에-터널을-설정하기-위해-요청하는-메서드-주로-ssltls-같은-보안-계층을-설정할-때-사용">- CONNECT: 클라이언트와 서버 간에 터널을 설정하기 위해 요청하는 메서드. 주로 SSL/TLS 같은 보안 계층을 설정할 때 사용.</h4>
<h4 id="--trace-서버에게-클라이언트로부터-수신한-요청을-그대로-반환하여-테스트하는-메서드-주로-디버깅이나-테스트-목적으로-사용">- TRACE: 서버에게 클라이언트로부터 수신한 요청을 그대로 반환하여 테스트하는 메서드. 주로 디버깅이나 테스트 목적으로 사용.</h4>
<p>이러한 HTTP 메서드를 적절하게 활용하여 Java Spring에서 웹 애플리케이션을 개발할 수 있다.</p>
<h3 id="cors란">CORS란?</h3>
<ul>
<li><p>CORS (Cross-Origin Resource Sharing)는 웹 애플리케이션에서 다른 도메인 간에 리소스를 공유하기 위한 메커니즘. 이를 이해하기 위해서는 먼저 SOP (Same-Origin Policy)의 개념을 알아야 함.</p>
</li>
<li><p>SOP는 웹 브라우저에서 적용되는 보안 정책으로, 동일 출처 정책이라고도 함. 이 정책에 따르면, 웹 페이지에서 로드되는 리소스(HTML, CSS, JavaScript 등)는 동일한 출처(프로토콜, 호스트, 포트가 동일)에서만 로드되어야 함. 다른 출처에서 리소스를 로드하려면 SOP에 의해 제한되어 보안 상의 이유로 접근이 차단됨.</p>
<h5 id="하지만-이러한-정책은-다른-도메인-간에-리소스를-공유해야-하는-상황에서-문제를-일으킴-예를-들어-도메인-a에서-실행-중인-javascript-코드가-도메인-b에-위치한-api에-접근하여-데이터를-요청하는-경우-sop에-의해-차단됨-이때-cors가-필요">하지만 이러한 정책은 다른 도메인 간에 리소스를 공유해야 하는 상황에서 문제를 일으킴. 예를 들어, 도메인 A에서 실행 중인 JavaScript 코드가 도메인 B에 위치한 API에 접근하여 데이터를 요청하는 경우, SOP에 의해 차단됨. 이때 CORS가 필요.</h5>
</li>
<li><p>CORS는 웹 브라우저에서 SOP를 우회하는데, 서버는 클라이언트가 CORS를 지원하는지 확인하기 위해 HTTP 헤더인 &quot;Access-Control-Allow-Origin&quot;을 설정. 이 헤더에는 허용된 도메인의 목록이 포함되며, 클라이언트의 Origin과 비교하여 접근을 허용하거나 차단.</p>
</li>
<li><p>따라서 CORS는 클라이언트가 다른 도메인의 리소스에 안전하게 접근할 수 있도록 허용하면서도 보안을 유지하는 역할. 이를 통해 웹 애플리케이션 간의 상호작용이 가능하며, 다양한 도메인 간에 리소스를 공유하고 통신할 수 있음.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[240108 TIL RDMBS정규화, Primary Key, Foreign Key]]></title>
            <link>https://velog.io/@ryan_jang/240108-TIL-RDMBS%EC%A0%95%EA%B7%9C%ED%99%94-Primary-Key-Foreign-Key</link>
            <guid>https://velog.io/@ryan_jang/240108-TIL-RDMBS%EC%A0%95%EA%B7%9C%ED%99%94-Primary-Key-Foreign-Key</guid>
            <pubDate>Mon, 08 Jan 2024 07:57:37 GMT</pubDate>
            <description><![CDATA[<h3 id="rdmbs의-정규화">RDMBS의 정규화</h3>
<h4 id="rdbms의-정규화---데이터베이스-설계를-최적화하는-프로세스로-중복-데이터를-제거하고-데이터-무결성을-유지하는-데-중점을-둠">RDBMS의 정규화 - 데이터베이스 설계를 최적화하는 프로세스로, 중복 데이터를 제거하고 데이터 무결성을 유지하는 데 중점을 둠.</h4>
<p> 정규화는 여러 단계로 나뉘며, 각 단계는 다음 조건들을 충족해야 함.</p>
<h4 id="제1정규형1nf">제1정규형(1NF)</h4>
<ul>
<li>모든 레코드는 &#39;유일한 키&#39;에 의해 식별돼야 함. 이는 중복 데이터를 방지하며, 각 레코드를 유일하게 식별할 수 있는 기본 키를 설정함으로써 달성됨.</li>
</ul>
<h4 id="제2정규형2nf">제2정규형(2NF)</h4>
<ul>
<li>제1정규형을 충족하고, 부분적 함수 종속성이 없어야 함. 즉, 테이블의 모든 속성이 기본 키에 완전히 종속돼야 함. 이는 데이터 무결성을 더욱 강화함.</li>
</ul>
<h4 id="제3정규형3nf">제3정규형(3NF)</h4>
<ul>
<li>제2정규형을 충족하고, 이행적 함수 종속성이 없어야 함. 즉, 키가 아닌 모든 속성이 기본 키에만 직접적으로 종속돼야 함. 이는 불필요한 데이터 종속성을 제거하여 중복을 더욱 줄임.</li>
</ul>
<p>이 외에도 BCNF, 제4정규형, 제5정규형 등이 있지만 대부분의 경우 제3정규형까지만 적용해도 충분.</p>
<p>정규화는 중복 데이터를 제거함으로써 디스크 공간을 절약하고, 데이터 무결성을 향상시킴. 그러나 너무 많이 정규화하면 오히려 쿼리 성능이 저하되므로, 성능과 무결성 사이에서 적절한 균형을 찾아야 함.</p>
<h3 id="primary-key-foreign-key">Primary Key, Foreign Key</h3>
<h4 id="primary-key와-foreign-key는-spring-프레임워크에서-데이터베이스와-상호작용할-때-중요한-역할">Primary Key와 Foreign Key는 Spring 프레임워크에서 데이터베이스와 상호작용할 때 중요한 역할.</h4>
<h4 id="1-primary-key-기본-키">1. Primary Key (기본 키)</h4>
<ul>
<li>기본 키는 데이터베이스 테이블에 있는 각 레코드를 유일하게 식별하는 열(또는 열의 집합). Spring에서는 JPA (Java Persistence API)를 이용해 Entity 클래스에 @Id 어노테이션을 사용하여 기본 키를 정의.</li>
</ul>
<pre><code>@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // ...
}</code></pre><ul>
<li>위의 코드에서 @GeneratedValue 어노테이션은 기본 키 생성 전략을 지정합니다. GenerationType.IDENTITY는 데이터베이스가 자동으로 ID를 생성하도록 합니다.</li>
</ul>
<h4 id="2-foreign-key-외래-키">2. Foreign Key (외래 키)</h4>
<ul>
<li>외래 키는 한 테이블의 필드(또는 필드의 집합)가 다른 테이블의 기본 키를 참조하는 것. 이는 두 테이블 사이의 관계를 설정하고, 데이터 무결성을 유지하는 데 도움됨. Spring에서는 @ManyToOne, @OneToMany, @OneToOne, @ManyToMany 등의 어노테이션을 사용하여 관계를 정의.</li>
</ul>
<pre><code>@Entity
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = &quot;user_id&quot;)
    private User user;
    // ...
}
</code></pre><ul>
<li>위의 코드는 User와 Post 사이에 1:N 관계를 정의함.  @ManyToOne 어노테이션은 Post와 User 사이에 다대일 관계를 정의하고, @JoinColumn 어노테이션은 외래 키로 사용할 열을 지정.
이 때, 외래 키는 레코드가 참조 무결성을 유지하도록 보장. 즉, 외래 키 값은 반드시 참조하는 테이블의 기본 키 값을 가진 레코드가 존재해야 함.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[240105 TIL - NoSQL, RDBMS, MVC패턴]]></title>
            <link>https://velog.io/@ryan_jang/240105-TIL-NoSQL-RDBMS-MVC%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@ryan_jang/240105-TIL-NoSQL-RDBMS-MVC%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Fri, 05 Jan 2024 11:57:24 GMT</pubDate>
            <description><![CDATA[<p>본격적으로 Spring 최종 팀프로젝트를 시작하면서, 매일 개념을 다시 한 번 다지는 시간을 가져보기로 했다.</p>
<h3 id="nosql과-rdbms의-특징과-차이점에-대해서-장-단점을-들어-설명하라">NoSQL과 RDBMS의 특징과 차이점에 대해서 장, 단점을 들어 설명하라.</h3>
<ol>
<li>관계형 데이터베이스 (Relational Database): RDBMS는 데이터를 테이블 형태로 저장하며, 이러한 테이블 간의 관계를 통해 데이터를 구성함.</li>
<li>Schema (스키마): RDBMS에서는 데이터의 구조가 사전에 정의된 스키마에 따라야 합니다. 이는 데이터베이스 테이블, 열, 데이터 유형 등을 정의하는 데 사용됨.</li>
<li>Table (테이블): 데이터가 행과 열의 형태로 구성된 테이블에 저장됩니다. 각 행은 레코드를 나타내며, 각 열은 해당 레코드의 속성을 나타냄.</li>
<li>SQL (Structured Query Language): RDBMS에서 데이터를 조작하기 위한 표준화된 언어로, SQL을 사용하여 데이터 검색, 삽입, 업데이트, 삭제 등의 작업을 수행할 수 있음.</li>
</ol>
<p>&lt;장점&gt;</p>
<ul>
<li>데이터 일관성: RDBMS는 ACID 속성을 준수하여 데이터 일관성을 보장.</li>
<li>복잡한 쿼리 처리: 복잡한 쿼리를 처리하고 다양한 연산을 수행하는 데 효과적.
&lt;단점&gt;</li>
<li>확장 어려움: 수평적 확장이 어려워 대규모 데이터 처리에 한계가 있음.</li>
<li>고정된 스키마: 스키마가 고정되어 있어 데이터 모델 변경이 어려울 수 있음.</li>
</ul>
<p>NoSQL (비관계형 데이터베이스):</p>
<ol>
<li>대용량데이터 (Big Data): NoSQL은 대용량 및 분산 데이터를 처리하는 데 특화됨.</li>
<li>비규격화 (Schema-less): NoSQL은 유연한 데이터 모델을 제공하며, 스키마가 사전에 정의되지 않아도 데이터를 저장하고 검색할 수 있음.</li>
<li>Key, Value: NoSQL 데이터베이스는 주로 Key-Value, Document, Column-family, 또는 Graph 형태의 모델을 사용하여 데이터를 저장.</li>
</ol>
<p>&lt;장점&gt;</p>
<ul>
<li>유연성: 스키마의 자유로움으로 데이터 모델을 쉽게 변경하고 대처할 수 있음.</li>
<li>확장성: 수평적 확장이 용이하며, 대규모 데이터 처리에 효과적.
&lt;단점&gt;</li>
<li>일관성 보장의 어려움: NoSQL은 일관성, 가용성, 분할 허용성 중에서 선택할 수 있는데, 모든 속성을 동시에 보장하기 어려울 수 있음.</li>
<li>표준화 부족: 특정 NoSQL 데이터베이스 간에 표준화가 부족하여 개발자들이 각각의 데이터베이스에 맞게 학습해야 할 필요가 있음.</li>
</ul>
<h3 id="mvc패턴에-대해서-설명하라">MVC패턴에 대해서 설명하라.</h3>
<p>Spring에서의 MVC 패턴은 Model, View, Controller 세 가지 구성 요소로 이루어져 있음. 이러한 패턴은 소프트웨어를 구조화하고 각 역할을 분리하여 유지보수성을 향상시키는 데 도움이 됨.</p>
<h4 id="model-모델">Model (모델)</h4>
<ol>
<li><p>역할: 비즈니스 로직과 데이터 처리를 담당.</p>
</li>
<li><p>특징
1) 데이터의 상태를 나타내는 객체 또는 클래스로 구성.
2) 데이터베이스와의 상호 작용, 데이터의 가공 및 처리 등을 담당.
3) View나 Controller에 대한 정보를 포함하지 않아야 함.
ex. 예시(Spring) - JPA 엔터티 클래스, 비즈니스 로직을 담당하는 서비스 클래스 등.</p>
</li>
</ol>
<h4 id="view-뷰">View (뷰)</h4>
<ol>
<li><p>역할: 사용자에게 보여지는 화면을 담당.</p>
</li>
<li><p>특징
 1) 사용자 인터페이스를 나타내는 부분으로, HTML, JSP, Thymeleaf 등을 통해 구현.
 2) 사용자에게 정보를 표시하고 사용자의 입력을 받아 Controller에 전달.
 3) Model의 데이터를 표시하기 위해 Model과 상호 작용할 수 있습니다.
ex. 예시(Spring) - Thymeleaf, JSP, HTML 등의 템플릿 엔진을 사용하여 구현된 뷰 페이지가 해당.</p>
</li>
</ol>
<h4 id="controller-컨트롤러">Controller (컨트롤러)</h4>
<ol>
<li><p>역할: 사용자의 입력을 받아 해당 요청에 대한 처리를 진행하고, 그 결과를 Model 또는 View에 전달합니다.</p>
</li>
<li><p>특징:
  1) 클라이언트로부터 요청을 받아 그에 따른 비즈니스 로직을 호출하고, Model에 데이터를 전달합니다.
  2) 사용자의 입력을 검증하고 필요한 서비스를 호출하여 비즈니스 로직을 수행합니다.
  3) 처리 결과를 View에 전달하여 사용자에게 응답합니다.
ex. 예시(Spring) - Controller 어노테이션을 사용한 컨트롤러 클래스가 해당. 사용자의 요청을 처리하고, 비즈니스 로직을 호출하여 결과를 Model에 담아 View에 전달.</p>
</li>
</ol>
<p>이러한 MVC 패턴은 각각의 역할을 분리함으로써 시스템을 모듈화하고 유연성을 높이며, 유지보수 및 확장이 쉽도록 구조화하는데 도움을 줌.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[231212 TIL ORM이 무엇인가]]></title>
            <link>https://velog.io/@ryan_jang/231212-TIL-ORM%EC%9D%B4-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</link>
            <guid>https://velog.io/@ryan_jang/231212-TIL-ORM%EC%9D%B4-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</guid>
            <pubDate>Tue, 12 Dec 2023 14:29:48 GMT</pubDate>
            <description><![CDATA[<p>-- 이번에는 본격적으로 RAW JPA에 대해 공부하기 앞서 기본 배경지식인 ORM에 대해 살펴보고자 한다.</p>
<ul>
<li>왜 ORM 의 탄생 배경을 알아야 하나?</li>
</ul>
<ol>
<li>내가 입사할 회사에 JPA 가 적용안된 프로젝트가 있을 수 있다!<ul>
<li>DB가 탄생한 후 수십년 후에야 ORM 이 나왔고 그뒤로 수년 후에야 JPA 그리고 SpringData JPA가 나왔다.</li>
<li>따라서 모든 회사의 모든 프로젝트가 JPA 또는 SpringData JPA 가 적용되어 있는 것이 아님!</li>
<li>프로젝트에 따라 QueryMapper를 쓰기도 한다.(대기업 및 금융)</li>
</ul>
</li>
<li>ORM 은 갑자기 나타난것이 아니라 점차 발전해온 DB 연동 기술이론이다.<ul>
<li>JDBC &gt; ( QueryMapper &gt; ORM(JPA)) 는 포함/개선 관계.</li>
<li>이전 기술의 문제점을 개선하기 위해서 탄생하였기 때문에 이전 기술의 기능을 포함한다.</li>
<li>그렇기 때문에 ORM 이 어떤 문제를 해결하고자 했는지 알아야 기능을 제대로 사용할 수 있다.</li>
</ul>
</li>
</ol>
<h2 id="1-db-탄생-후-java-앱과-연동을-위해-jdbc-이-탄생했다">1. DB 탄생 후 Java 앱과 연동을 위해 JDBC 이 탄생했다.</h2>
<h3 id="jdbc">JDBC</h3>
<ul>
<li><p>Java Database Connectivity</p>
<ul>
<li>문장 그대로 Java 앱과 DB 를 연결시켜주기 위해 만들어진 기술이다.</li>
<li>그렇기 때문에 JPA 도 이 기술을 사용하여 구현되어 있다.</li>
</ul>
</li>
<li><p>JDBC Driver 는 여러타입의 DB 와 연결할 수 있는 기능을 제공한다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/22c9f272-3bbf-433a-a965-0808ff2a5a10/image.png" alt=""></p>
<ul>
<li>JDBC Driver Manager 는 런타임 시점에<ul>
<li>Connection(연결) 을 생성하여 쿼리를 요청할 수 있는 상태를 만듦</li>
<li>Statement(상태) 를 생성하여 쿼리를 요청!</li>
<li>ResultSet(결과셋) 을 생성해 쿼리 결과를 받아올 수 있게 해줌.
🚫 사용 후엔 각각 close()를 호출해 자원 해제를 시켜줘야 한다! 🚫</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/517cddd7-cb33-4b95-a8a5-6bf21841e105/image.png" alt=""></p>
<h2 id="2-jdb-의-여러-문제로-querymapper이-탄생">2. JDB 의 여러 문제로 QueryMapper이 탄생.</h2>
<ul>
<li><p>JDBC 로 직접 SQL을 작성했을때의 문제</p>
<ul>
<li>SQL 쿼리 요청시 중복 코드 발생</li>
<li>DB별 예외에 대한 구분 없이 Checked Exception (SQL Exception) 처리</li>
<li>Connection, Statement 등.. 자원 관리를 따로 해줘야 함<ul>
<li>안 해주면 메모리 꽉 차서 서버가 죽음</li>
</ul>
</li>
</ul>
</li>
<li><p>이 문제 해결을 위해 처음으로 Persistence Framework 등장!</p>
<ul>
<li>2가지의 Persistence Framework<ul>
<li>SQL Mapper : JDBC Template, MyBatis 👈 이게 먼저 등장!</li>
<li>ORM : JPA, Hibernate</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>SQL Mapper (QueryMapper)</strong></p>
<ul>
<li>SQL ↔ Object</li>
<li>SQL 문과 객체(Object)의 필드를 매핑하여 데이터를 객체화</li>
</ul>
</li>
</ul>
<h3 id="jdbc-template">JDBC Template</h3>
<ul>
<li><p>SQL Mapper 첫번째 주자로 JDBCTemplate 탄생</p>
<ul>
<li>쿼리 수행 결과와 객채 필드 매핑</li>
<li>RowMapper 로 응답필드 매핑코드 재사용</li>
<li>Connection, Statement, ResultSet 반복적 처리 대신 해줌</li>
<li>But, 결과값을 객체 인스턴스에 매핑하는데 여전히 많은 코드가 필요함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/edeb44d5-f415-4723-b6d4-e819ce956b5a/image.png" alt=""></p>
</li>
</ul>
<h3 id="mybatis">MyBatis</h3>
<ul>
<li><p>SQL Mapper 두번째 주자로 MyBatis 탄생</p>
<ul>
<li>반복적인 JDBC 프로그래밍을 단순화</li>
<li>SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL 을 분리!</li>
<li>But, 결국 SQL을 직접 작성하는것은 피곤하다…(DB 기능에 종속적)</li>
<li>But, 테이블마다 비슷한 CRUD 반복, DB타입 및 테이블에 종속적이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/77b2af1e-5a29-4ca1-b142-cb4465877c06/image.png" alt=""></p>
</li>
</ul>
<h2 id="3-querymapper-의-db의존성-및-중복-쿼리-문제로-orm-이-탄생">3. QueryMapper 의 DB의존성 및 중복 쿼리 문제로 ORM 이 탄생!</h2>
<ul>
<li>ORM은 DB의 주도권을 뺏어왔다고 표현해도 과언이 아님.</li>
<li>ORM은 DAO 또는 Mapper를 통해서 조작하는것이 아니라, 테이블을 아예 하나의 객체(Object)와 대응시킨다!</li>
<li>객체지향(Object)을 관계형 데이터베이스(Relation)에 매핑(Mapping)하는 것에는 정말 많은 난관이 있다.
<img src="https://velog.velcdn.com/images/ryan_jang/post/7271bfaa-fd7c-4c6d-b4e6-ba1516f10c90/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[231207 YIL 모던 자바]]></title>
            <link>https://velog.io/@ryan_jang/231207-YIL-%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94</link>
            <guid>https://velog.io/@ryan_jang/231207-YIL-%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94</guid>
            <pubDate>Tue, 12 Dec 2023 14:16:53 GMT</pubDate>
            <description><![CDATA[<h1 id="자바의-대격변">자바의 대격변</h1>
<h2 id="자바의-시작">자바의 시작</h2>
<ul>
<li>자바는 객체지향 프로그래밍이라는 소프트웨어 엔지니어링적인 이점을 가지고 있었고, jvm만 설치되어있다면, 어디서
나 실행시킬 수 있다는 장점 때문에 크게 사랑 받았다.</li>
<li>초기 C언어의 이식성을 닮아서 자바 역시 jvm이 설치되어있는 환경이라면 프로그램을 실행 시킬 수 있었다.</li>
</ul>
<h2 id="자바가-직면한-요구사항">자바가 직면한 요구사항</h2>
<h3 id="병렬-처리">병렬 처리</h3>
<ul>
<li>빅데이터를 처리할 필요성이 늘어났고, 멀티코어 컴퓨터와 같은 병렬 프로세싱이 가능한 장비들
이 보급되면서 새로운 요구사항들이 생겨남.</li>
<li>병렬처리 모델은 크게 2가지 모델로 구분 됨.</li>
</ul>
<p>-- 여기서 이 2가지 모델이 무엇인지 궁금해져 한 번 알아보았다.</p>
<h4 id="data-병렬-처리-모델">Data 병렬 처리 모델</h4>
<p>숫자 100개가 들어 있는 배열의 각 숫자의 제곱을 구하는 작업이 있다고 가정하자.</p>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/01875203-fd1e-4be9-8445-5db06b25cacb/image.png" alt=""></p>
<p>위 그림과 같이 100개의 데이터를 처리하는데 loop 100번을 돌아야 한다.
그럼, 1회당 4개의 데이터를 병렬 처리할 수 있다고 가정해보자.
<img src="https://velog.velcdn.com/images/ryan_jang/post/9cfa6067-b32f-46b5-a194-ca51619a3dc6/image.png" alt="">
100개의 데이터를 처리하는데 loop 25번이면 처리할 수 있다. 이를 Data 병렬 처리 모델이라 한다.
위와 같은 처리 기술로는 대표적으로 다음과 같은 기술들이 있다.</p>
<p>▶ CPU SSE (Streaming SIMD Extensions)</p>
<ul>
<li><p>SIMD (Single Instruction Multiple Data)라고도 함.</p>
</li>
<li><p>단일 명령어로 복수의 데이터를 처리.</p>
</li>
<li><p>xmm이라는 8개의 128 bit 레지스터(샌드브릿지 아키텍처부터는 256 bit 레지스터) 존재하여 해당 레지스터를 통해 복수 데이터를 처리하는 기술</p>
</li>
</ul>
<p>▶ OpenMP (Open Multi-Processing)</p>
<ul>
<li><p>공유 메모리 다중 처리 프로그래밍 API</p>
</li>
<li><p>특정 구간을 병렬화 시켜주는 기술</p>
</li>
</ul>
<p>▶ Intel TBB (Threading Building Blocks)의 Generic Parallel Algorithms</p>
<ul>
<li>parallel_for, parallel_do, parallel_while, parallel_reduce, parallel_scan 등등</li>
</ul>
<p>▶ CUDA</p>
<ul>
<li>NVIDIA 사 GPGPU의 매니코어 사용할 수 있는 라이브러리</li>
</ul>
<p>▶ OpenCL (Open Computing Language)</p>
<ul>
<li>CUDA 보다 좀 더 확장된 개념으로 CPU, GPU, FPGA 등등의 멀티/매니코어 플랫폼을 이용하기 위한 표준 기술 등이 있다.</li>
</ul>
<p>▶ SDAccel</p>
<ul>
<li>Xilinx 사의 FPGA 기반 프로그램을 보다 손쉽게 작성할 수 있도록 하는 개발 플렛폼으로 OpenCL, C, C++등의 언어로 작성할 수 있다.</li>
</ul>
<h4 id="task-병렬-처리-모델-task--작업-단위">Task 병렬 처리 모델 (Task : 작업 단위)</h4>
<p>자동차를 만드는 공장이라고 가정해 보자. Task 병렬 처리 모델에서는 가중치가 필요한데, 예제에서는 가중치를 작업 시간으로 정했다.</p>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/fe8ad92f-ab9c-464d-82be-d7ac5560dc7f/image.png" alt=""></p>
<p>해당 각각의 Task를 3개의 PE(Processing Element, 실행의 기본 단위가 되는 하드웨어 유닛)로 나누어보자. 어려우니 3 core로 나눈다고 가정한다.</p>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/dc037f1f-4a2c-4ee5-a863-8e5af43e0d40/image.png" alt=""></p>
<p>소요 시간이 24시간에서 12시간으로 줄었는데, 언뜻 보기에도 이상하다. 위의 예제는 Task를 잘못 분할한 예제다.</p>
<p>그럼, 각각의 Task의 작업 시간을 고려해서 바르게 분할해 보자.
<img src="https://velog.velcdn.com/images/ryan_jang/post/bc463de6-dab2-4389-b350-417f14394c21/image.png" alt=""></p>
<p>소요시간 12시간 작업이 8시간으로 줄면서, 보기 좋게 분할되었지요. 그러나, 현실 세계에서 위의 예제처럼 예쁘게 분할하기는 쉽지 않다. 많은 테스트를 통해 경험치를 쌓아야 한다. 이런 걸, Task 병렬 처리 모델이라고 한다.</p>
<p>실제 프로그램을 구현함에 있어서는 Data 병렬 처리 모델과 Task 병렬 처리 모델을 골고루 잘 활용하여 써야 한다.</p>
<p>또한, Task 병렬 처리 모델에서 제일 중요한 것은 서로 독립적인 Task(즉, 타 Task에 영향을 적게 주는)를 잘 분리해서 분할해야 한다는 것이다. 여러 개의 Task에서 하나의 데이터를 갱신하는 구조에 병렬 처리를 사용하려면 데이터 동기화부터 시작해서 매우 복잡해지기 때문이다.</p>
<p>위와 같은 처리 기술 종류에는 대표적으로 아래와 같은 기술들이 있다.</p>
<p>▶ Intel TBB (Threading Building Blocks)의 Flow Graph 와 Task Scheduler</p>
<p>▶ CUDA</p>
<p>: NVIDIA 사 GPGPU의 매니코어 사용할 수 있는 라이브러리</p>
<p>▶ OpenCL (Open Computing Language)</p>
<p>: CUDA 보다 좀 더 확장된 개념으로 CPU, GPU, FPGA 등등의 멀티/매니코어 플랫폼을 이용하기 위한 표준 기술</p>
<p>▶ SDAccel</p>
<p>: Xilinx 사의 FPGA 기반 프로그램을 보다 손쉽게 작성할 수 있도록 하는 개발 플랫폼. OpenCL, C, C++등의 언어로 작성할 수 있다.</p>
<p>지금까지 병렬 처리의 개념적인 2가지 모델에 대하여 살펴보았는데, 여기서 짚고 넘어가야 하는 중요한 법칙이 하나 있다.
바로 “암달의 법칙”이다.</p>
<h4 id="암달의-법칙">암달의 법칙</h4>
<p>진 암달이라는 연구자가 시스템의 어느 한 부분이 향상될 때 전체 시스템은 최대 얼마큼 향상될 수 있는지 예측하는 연구를 진행했다.</p>
<p>그의 주장은 이러하다.</p>
<ul>
<li>시스템 전체를 2배 빠르게 수행하면, 실제 2배가 향상된다고 볼 수 있다. 
그러나, 시스템의 절반만 2배 빠르게 수행하면, 시스템 전체는 1.33배가 향상된다&quot;</li>
</ul>
<p>아래 그림을 보자.
<img src="https://velog.velcdn.com/images/ryan_jang/post/f5fd5932-1cc3-460b-9c76-155f540c0493/image.png" alt=""></p>
<p>위와 같은 작업이 있다고 했을 때 어느 특정 구간을 병렬 처리를 진행합니다.</p>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/7420780c-d398-4124-bf1c-13d44b150e81/image.png" alt=""></p>
<p>더 향상시켜
<img src="https://velog.velcdn.com/images/ryan_jang/post/2264ee7d-3d22-43f7-8aa4-d54850452f86/image.png" alt=""></p>
<p>더 향상시켜
<img src="https://velog.velcdn.com/images/ryan_jang/post/5077f3e0-9a02-4ddd-bbc5-aa75be88bc8a/image.png" alt=""></p>
<p>결국, 암달의 법칙이란 &#39;아무리 많은 core를 가지고 특정 구간을 0에 가깝게 병렬화한다고 해도, 전체 수행 시간은 직렬화 구간의 실행 속도보다 더 빨라질 수는 없다&#39;는 것.
마치, CUDA를 통해 병렬 프로그램을 할 때 GPU의 수많은 core를 활용하여 병렬 처리한다고 하더라도 cache memory에 있는 데이터를 GPU 메모리에 복사하고 GPU의 수행 결과를 cache memory에 복사하는 시간보다 빨라질 수는 없다는 얘기이다.</p>
<p>그 후 20년이 지난 요즘 암달의 법칙을 새롭게 해석한 연구자가 있다.</p>
<h4 id="존-구스타프슨">존 구스타프슨</h4>
<p>기존에 암달의 법칙에 하드웨어 기술이 급속하게 향상된다는 것을 추가한 내용이다.
<img src="https://velog.velcdn.com/images/ryan_jang/post/f3ceb9f5-ea07-404e-80e0-ac47e26eec67/image.png" alt=""></p>
<p>위의 그림에서 보는 것과 같이 하드웨어 기술의 발달로 동일 소요 시간당 작업량이 늘어날 수 있고 그로 인해 작업량을 기준으로 속도가 향상된다는 이야기이다.</p>
<p>-- 병렬처리에 관한 굉장히 흥미로운 고찰이다.</p>
<h3 id="함수형-프로그래밍">함수형 프로그래밍</h3>
<ul>
<li><p>함수형 프로그래밍은, 객체 지향 프로그래밍처럼 프로그래밍의 패러다임의 한 종류.</p>
<h4 id="객체-지향-프로그래밍의-핵심-아이디어">객체 지향 프로그래밍의 핵심 아이디어?</h4>
<ol>
<li>객체 지향 프로그래밍의 핵심 아이디어 자체는 간단하다.
a. &#39;프로그램을 객체들의 협력과 상호작용으로 바라보고 구현한다&#39;<ol start="2">
<li>그 객체들을 정의하기 위해서 추상화와 같은 개념들을 사용하는 것.</li>
<li>핵심 개념을 통해서 달성하는 효용은 다음과 같다.
a. 코드의 재사용성이 높아진다.
b. 코드를 유지보수, 확장 하기 쉬워진다.
c. 코드를 신뢰성 있게 사용하기 쉬워진다.</li>
</ol>
</li>
</ol>
</li>
</ul>
<h4 id="함수형-프로그래밍의-핵심-아이디어">함수형 프로그래밍의 핵심 아이디어?</h4>
<ol>
<li>함수형 프로그래밍의 핵심 아이디어 역시 간단합니다.
 a. “수학의 함수처럼, 특정한 데이터에 의존하지 않고, 관련없는 데이터를 변경하지도 않으며, 결과값이 오직 입력
값에만 영향을 받는 함수를 순수함수라고 합니다”</li>
</ol>
<ul>
<li><p>순수한 함수와 순수하지 못한 함수들</p>
<pre><code>// 수학의 함수
f(x, y) = x + 2xy

// 순수한 메서드
// input에 따라 output은 항상 일정!
  public int someMethod(int x, int y) {
return x + 2y;
}

class notFunc {
private int y = 0;
private int result;

// 순수 메서드가 아닌 메서드
// 메서드 안에서 제어할 수 없는 y라는 값에 의해 output이 바뀔 수 있다
public int anotherMethod(int x) {
return x + this.y * 2;
}

// 순수 메서드가 아닌 메서드 2
// 메서드 내에서 this.result 값을 변경하고 반환하기 때문에
// 순수 메서드라고 보기는 어렵습니다!
public int otherMethod(int x, int y) {
int result = x + 2 * y;
this.result = result;
return result;
}
}</code></pre><p>b. &#39;프로그램을 순수한 함수의 모음으로 바라보고 구현한다&#39;.</p>
</li>
</ul>
<ol start="2">
<li>핵심 개념을 통해서 달성하는 효용은 다음과 같다.
a. 검증이 쉽다 (검증이 필요한 부분만 검증 할 수 있음)
b. 성능 최적화가 쉽다 (특정 input에 대한 output을 재사용 할 수 있음 - 캐싱)
c. 동시성 문제를 해결하기 쉽다 (함수는 다른 값의 변경을 야기하지 않음)</li>
</ol>
<h4 id="결론---자바함수의-변화">결론 - 자바함수의 변화</h4>
<h5 id="자바-함수형-프로그래밍의-기능들을-추가하기로-결정">자바 함수형 프로그래밍의 기능들을 추가하기로 결정!</h5>
<ul>
<li><p>함수형 프로그래밍 아이디어 1 : 함수를 일급 값으로</p>
<ol>
<li>우리가 지금까지 배웠던 자바에서 “조작할 수 있는”값은 다음과 같다.
a. 기본값 (int, long, bollean, …)
b. 객체</li>
<li>1-a, 1-b 와 같은 값들은 다음과 같은 특징을 갖는다.
a. 함수에 인자로 넘길 수 있다.
b. 함수의 결과로 반환 할 수 있다.
c. 값을 수정할 수 있다
d. 값을 변수에 대입할 수 있다.</li>
<li>사실상 프로그래밍에서 지원하는 모든 연산을 지원하고 있고, 이러한 연산을 모두 지원하는 “값”들을 일급 시민, 또
는 일급 객체라고 한다.</li>
<li>그러나 메서드는 어떤가?
a. 메서드에 인자로 메서드를 넘길 수 있는가?
b. 메서드의 결과로 메서드를 반환 할 수 있는가?
c. 메서드를 변수에 대입 할 수 있는가?</li>
<li>특정한 연산을 지원하지 않는 값이기 때문에 메서드는 이급 시민으로 볼 수 있다.</li>
<li>그렇지만 함수를 값으로 취급 할 수 있다면 매우 많은 것들을 할 수 있고, 함수형 프로그래밍에서는 이를 적극 이용
해 오고 있었다.</li>
</ol>
</li>
<li><p>결론 : Java 8에 메서드 참조 기능이 도입!</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[231203 YIL 오류와 예외에 관하여]]></title>
            <link>https://velog.io/@ryan_jang/231203-YIL-%EC%98%A4%EB%A5%98%EC%99%80-%EC%98%88%EC%99%B8%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC</link>
            <guid>https://velog.io/@ryan_jang/231203-YIL-%EC%98%A4%EB%A5%98%EC%99%80-%EC%98%88%EC%99%B8%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC</guid>
            <pubDate>Wed, 06 Dec 2023 02:14:15 GMT</pubDate>
            <description><![CDATA[<p>이번에는 예외와 오류에 관하여 복습을 해보고자 한다.</p>
<p>자바 코딩을 하다보면 결코 피할 수 없는 두 가지가 바로 오류와 예외이다.</p>
<h3 id="오류error">오류(Error)</h3>
<ul>
<li>일반적으로 회복이 불가능한 문제.</li>
<li>보통 시스템 레벨, or 환경적인 이유로 발생.</li>
<li>코드 문제도 있지만 회복 불가능.</li>
<li>에러가 발생한 경우 우리는 어떠한 에러로 프로그램이 종료되었는지를 확인하
고 대응.</li>
</ul>
<h3 id="예외exception">예외(Exception)</h3>
<ul>
<li>일반적으로 회복이 가능한 문제.</li>
<li>회복 가능하다 함은, 예외가 발생할 수 있다는 것을 인지하고 대응할 수 있다는 뜻.</li>
<li>코드레벨에서 문제상황 대응은 &#39;예외처리&#39;에 속함.</li>
</ul>
<h4 id="컴파일-에러">컴파일 에러</h4>
<ul>
<li>.java 파일을 .class 파일로 컴파일할때 발생하는 에러.</li>
<li>대부분 여러분이 자바 프로그래밍 언어의 규칙을 지키지 않았기 때문에 발
생.</li>
<li>존재하지 않는 클래스를 호출한다거나, 접근이 불가능한 프로퍼티나
메소드에 접근한다거나 하는 경우에 발생.</li>
<li>해결방법 : 문법에 맞게 다시 작성!</li>
</ul>
<h4 id="런타임-에러">런타임 에러</h4>
<ul>
<li>코딩시 자주 접하게 될 에러(예외).</li>
<li>문법적인 오류는 아니라서, 컴파일은 잘 되었지만 “프로그램”이 실행 중 생기는 예외.</li>
</ul>
<h4 id="미확인된-예외">미확인된 예외</h4>
<ul>
<li>런타임 시점에 확인되는 예외.</li>
<li>예외 처리가 반드시 필요하지 않은 예외.</li>
</ul>
<h3 id="throws와-throw">throws와 throw</h3>
<p>예외에 관한 자바문법 중에 헷갈리는 문법이 있는데, 대표적인 문법이 바로 throw이다.</p>
<p>아래의 표는 어떤 차이점이 있는지 정리해놓은 표이다.
<img src="https://velog.velcdn.com/images/ryan_jang/post/42e473eb-6c61-4d4e-b87e-cfb2051536bb/image.png" alt=""></p>
<h4 id="클래스-및-메서드를-만들며-우리의-메서드의-위험성-알리기throw-throws">클래스 및 메서드를 만들며 우리의 메서드의 위험성 알리기(throw, throws)</h4>
<p>처음에 위험성이라는 말이 선뜻 와닿지 않았다.
위험성이라는 말은 곧 오류가 발생할 가능성을 내포하고 있다는 뜻이 된다.
그것을 미리 알고 코딩으로 상황을 가정해 대처하는 것이 곧 &#39;예외처리&#39;이다.</p>
<ul>
<li>예측이 될 때, 바로 이 throw로 이 메서드가 위험함을 알린다.</li>
</ul>
<h3 id="예외-handling">예외 Handling</h3>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/9df2b55d-4f19-4d7f-910e-6b7e520f9adb/image.png" alt=""></p>
<h4 id="1-위험-감지하기">1. 위험 감지하기</h4>
<p>특정한 클래스의 메서드를 사용할 때, 특히 우리가 작성한 코드가 아니
라면 더더욱, 이 메서드가 위험한지 알아봐야 한다.</p>
<h4 id="2-try-catchfinally-키워드-이용하기">2. try-catch(finally) 키워드 이용하기</h4>
<ul>
<li>try - catch 는 각각 중괄호 {} 를 통해 실행할 코드들을 담는다.</li>
<li>try : 중괄호 {} 안에는 예외가 발생할 수 있지만 실행을 시도할 코드!</li>
<li>catch : 중괄호 {} 안에는 try 안에있는 코드를 실행하다가 예외가 났을때 실행할 코드!</li>
<li><ul>
<li>catch 는 소괄호 () 를 통해 어떤 예외클래스를 받아서 처리할지 정의해
주어야 함!</li>
</ul>
</li>
<li><ul>
<li>catch 로 모든 예외를 다 받고 싶으면 Exception 을 넣어주면 된다.</li>
</ul>
</li>
<li><ul>
<li>catch 로 일부 예외만 받아서 처리하고 싶으면 해당 예외 클래스명을 넣어
주면 된다!</li>
</ul>
</li>
<li><ul>
<li>1개의 try 문에 catch 문은 여러개 사용할 수 있습니다. ex) 1 try : 4 catch</li>
</ul>
</li>
<li>기존 try - catch 의 맨 마지막에 finally 를 붙여서 마지막에 반드시 실행할 코드를 넣을 수 있음</li>
</ul>
<p>객체지향성을 가지는 자바언어답게, 위와 같이 “문제”를 추상화해서 객체와 상속관계를 이용해 구현할 수 있다.</p>
<h4 id="java의-throwable-class">java의 throwable class?</h4>
<ul>
<li>시작은 모든 객체의 원형인 Object 클래스에서부터!</li>
<li>“문제 상황”을 뜻하는 Throwable 클래스가 Object 클래스를 상속한다.</li>
<li>Throwable 클래스의 자식으로 앞서 배운 에러( Error )와 예외( Exception ) 클래스가 있다.</li>
<li>에러( Error ) 클래스와 예외( Exception ) 클래스는 각각 IOError 클래스, RuntimeException 클래스와 같이 구분하여 처리.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/754c9212-c339-4677-a384-8f5d283f2e1d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/455b1f03-743d-49ce-854f-a388e0a310a3/image.png" alt=""></p>
<p>위 그림의 RuntimeException을 상속한 예외들은 UncheckedException, 반대로 상속하지 않은 예외들은 CheckedException으로 구현되어 있다.</p>
<ul>
<li><p>즉 NullPointException, ArrayIndexOutOfBoundsException 등의 예외 구현체들은 명시적인 에러처리를 하지 않아도 컴파일 에러가 발생하지는 않는다.</p>
</li>
<li><p>Checked Exception에 속하는 에러 구현체들은 핸들링 하지 않으면 컴파일 에러가 발생하는 대신, 컴파일이 됐다면 100% 복구가 가능한 에러인 셈이다!</p>
</li>
<li><p>자바의 에러 구현체들 예시
<img src="https://velog.velcdn.com/images/ryan_jang/post/10f4e859-8a51-492a-8731-3f52e3fffe93/image.png" alt=""></p>
</li>
</ul>
<h3 id="chained-exception-실제-예외-처리하는-방법">Chained Exception, 실제 예외 처리하는 방법</h3>
<h4 id="연결된-예외-chained-exception">연결된 예외 (Chained Exception)</h4>
<ul>
<li>예외는 다른 예외를 유발할 수 있다!</li>
<li>예외 A가 예외 B를 발생시켰다면, 예외 A는 B의 원인 예외.</li>
<li>원인 예외를 새로운 예외에 등록한 후 다시 새로운 예외를 발생시키는데, 
이를 예외 연결이라 한다.</li>
</ul>
<h4 id="예외-연결하는-이유">예외 연결하는 이유?</h4>
<ul>
<li><p>여러 가지 예외를 하나의 큰 분류의 예외로
묶어서 다루기 위함!</p>
</li>
<li><p>checked exception은 unchecked exception으로 포장(wrapping)
하는데 유용하게 사용되기도 한다.</p>
</li>
<li><p>원인 예외를 다루기 위한 메소드</p>
</li>
<li><ul>
<li>initCause() : 지정한 예외를 원인 예외로 등록하는 메소드</li>
</ul>
</li>
<li><ul>
<li>getCause() : 원인 예외를 반환하는 메소드</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[231201 YIL 알고리즘 복습]]></title>
            <link>https://velog.io/@ryan_jang/231201-YIL-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B3%B5%EC%8A%B5</link>
            <guid>https://velog.io/@ryan_jang/231201-YIL-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B3%B5%EC%8A%B5</guid>
            <pubDate>Mon, 04 Dec 2023 04:38:52 GMT</pubDate>
            <description><![CDATA[<p>알고리즘은 내가 평소에 자신있어 하는 부분은 아니라서, 지속적으로 연습이 필요하다.
오전마다 코드카타라 이름 붙인 알고리즘 공부시간을 통해 쉬운 것부터 차근차근 익히는 중이다.
그 중에서 몇 가지 배운 것을 정리하고자 한다.(현재 자바언어를 학습 중이므로 대중적인 C언어가 아니라, 자바로 푸는 것을 연습했다)</p>
<h4 id="q1-정수-배열-numbers가-매개변수로-주어집니다-numbers의-원소의-평균값을-return하도록-solution-함수를-완성해주세요">Q1. 정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소의 평균값을 return하도록 solution 함수를 완성해주세요.</h4>
<h4 id="r-제한사항">R. 제한사항</h4>
<p>0 ≤ numbers의 원소 ≤ 1,000
1 ≤ numbers의 길이 ≤ 100
정답의 소수 부분이 .0 또는 .5인 경우만 입력으로 주어집니다.</p>
<h4 id="a-풀이">A. 풀이</h4>
<pre><code>class Solution {
    public double solution(int[] numbers) {
        double answer = 0;
        int total=0;                             
        for(int i=0; i&lt;numbers.length; i++) {   
            total+=numbers[i];                   
        }
        answer=(double)total/numbers.length;    
        return answer;
    }
}</code></pre><h4 id="t-시행착오">T. 시행착오</h4>
<p>결과적으로는 위와 같이 굉장히 간단한 코드로 끝나지만, 처음에는 i++와 ++i의 차이점을 구별하는 것이 꽤나 헷갈렸다.
우변의 결과값을 다시 좌변에 더한다는 의미의, 코딩에서 자주 사용하는 기호인 &#39;+=&#39;표시도 생소했다.
알고리즘에 가장 많이 쓰이는 함수 중 하나가 for 구문이므로, 제대로 익숙해질 필요가 있음을 느꼈다.</p>
<p>평균값은 정수가 아닐 수 있으므로 double로 변수명을 선언해준 뒤, 배열의 total은 배열의 길이와 관련된 변수명이므로 반드시 정수이므로 int로 선언해주는 것도 중요한 포인트였다. </p>
<p>또한, 제한사항을 내가 지정해줘야 하고 생각했는데, 팀원들과 이야기를 나누다 보니 제한사항은 문제에서 어떤 값을 대입할 것이냐는 부분이라 내가 고려할 부분이 아니라고 해서 그 부분은 코딩에서 뺐다.</p>
<p>변수명 선언시 괄호() 표시를 통해 계산식과 같은 좁은 영역에서 변수명 선언을 할 수 있다는 것도 새롭게 알았다. </p>
<h4 id="q2-함수-solution은-정수-x와-자연수-n을-입력-받아-x부터-시작해-x씩-증가하는-숫자를-n개-지니는-리스트를-리턴해야-합니다-다음-제한-조건을-보고-조건을-만족하는-함수-solution을-완성해주세요">Q2. 함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.</h4>
<h4 id="r-제한사항-1">R. 제한사항</h4>
<p>x는 -10000000 이상, 10000000 이하인 정수입니다.
n은 1000 이하인 자연수입니다.</p>
<h4 id="a-풀이-1">A. 풀이</h4>
<pre><code>class Solution {
  public long[] solution(int x, int n) {
      long[] answer = new long[n];
      for(int i=0; i&lt;n; i++){
         answer[i] = (long)x * (i+1);
      }
      return answer;
  }
}</code></pre><h4 id="t-시행착오-1">T. 시행착오</h4>
<p>문제가 길고 복잡해보여서 풀기 전부터 어렵겠다는 생각을 했으나, 막상 풀고 보니 의외로 간단히 끝나는 문제였다.</p>
<ul>
<li>x씩 증가하는 숫자이다 =&gt; for 구문을 사용한다</li>
<li>n개 지니는 리스트를 리턴한다 =&gt; 배열을 사용한다</li>
</ul>
<p>라고 생각하는 것이 키포인트였다.</p>
<p>역시 어떤 시행을 반복할 때 단골 함수인 for 구문이 활용된다.</p>
<p>x와 n은 각각 정수와 자연수이므로 int로 선언해줌을 볼 수 있다.</p>
<p>자연수는 1부터 시작이므로, i&lt;n이라는 조건식을 쓰기 위해서는 i=1이 아닌 i=0이라는 것을 주의해야 한다.</p>
<p>본격적인(?) java의 느낌이 드는, new를 통한 객체의 인스턴스화로 결과를 return할 수 있었다.</p>
<p>(long)x* (i+1)이라는 계산식이 처음에는 선뜻 떠오르지 않아서 한참을 헤맸다.</p>
<p>x가 10000000라는 큰 수이므로, 위에서 나왔듯 계산식에서 제한적으로 long으로 선언해주는 것이 포인트다. i는 처음에 0이고 계속해서 증가하므로, 배열에 i+1을 곱해서 리턴해야 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[231109 YIL Lombok과 TIL 알고리즘]]></title>
            <link>https://velog.io/@ryan_jang/231109-TIL</link>
            <guid>https://velog.io/@ryan_jang/231109-TIL</guid>
            <pubDate>Thu, 09 Nov 2023 10:49:04 GMT</pubDate>
            <description><![CDATA[<h2 id="lombok과-applicationproperties">Lombok과 application.properties</h2>
<h3 id="lombok이란">Lombok이란?</h3>
<h4 id="코드-절약">코드 절약!</h4>
<ul>
<li>Lombok(이하 롬복)은, 자바 프로젝트를 진행하는데 거의 필수적으로 필요한 메서드/생성자 등을 자동 생성해줌으로써 코
드를 절약할 수 있도록 도와주는 라이브러리.</li>
</ul>
<h3 id="사용">사용</h3>
<h4 id="memojava">Memo.java</h4>
<ul>
<li><p>[코드스니펫] Memo
<img src="https://velog.velcdn.com/images/ryan_jang/post/53add921-42af-4d0f-b58b-dbc9a4938d71/image.png" alt=""></p>
</li>
<li><p>Memo 클래스 @Getter
<img src="https://velog.velcdn.com/images/ryan_jang/post/22508fa4-ef0e-4819-90fd-77ff2f34c13f/image.png" alt=""></p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/c403f85b-315d-4e8b-b0cc-e09d429adcbe/image.png" alt=""></p>
<ul>
<li><p>클래스 위에 롬복 @Getter를 추가한 후 컴파일된 코드를 확인해보면 이처럼 직접 작성하지 않은 getUsername(),
getContents() 메서드가 자동으로 추가되어있음을 확인할 수 있다.</p>
</li>
<li><p>Memo 클래스 @Setter</p>
</li>
</ul>
<p>@Setter
public class Memo {
private String username;
private String contents;
}
...
public void setUsername(String username) {
this.username = username;
}
public void setContents(String contents) {
Spring Master - 1주차 49
this.contents = contents;
}</p>
<ul>
<li><p>set…() 메서드를 만들어 줌.</p>
</li>
<li><p>Memo 클래스 @AllArgsConstructor, NoArgsConstructor
<img src="https://velog.velcdn.com/images/ryan_jang/post/d50fd843-ff44-48c6-a972-3f8db2faa2d1/image.png" alt=""></p>
</li>
<li><p>기본 생성자와 모든 필드를 파라미터로 가진 오버로딩된 생성자를 만들어 줌.</p>
</li>
<li><p>Memo 클래스 @RequiredArgsConstructor
<img src="https://velog.velcdn.com/images/ryan_jang/post/98af793f-fe2b-4d28-b118-530cafd73479/image.png" alt=""></p>
</li>
<li><p>final 제어자가 붙은 필드를 파라미터로 가진 오버로딩된 생성자를 만들어 줌</p>
</li>
</ul>
<h4 id="applicationproperties">application.properties</h4>
<ul>
<li>application.properties는 Spring과 관련된 설정을 할 때 사용되는 파일.</li>
<li>Spring과 SpringBoot의 차이에 대해 학습할 때 SpringBoot를 사용하면 개발에 필요한 설정 정보들이 자동으로 설정된다.</li>
<li>이 파일을 사용하면 자동으로 설정되고 있는 설정 값을 쉽게 수정할 수 있다.</li>
<li>뿐만 아니라 DB 연결 시 DB의 정보를 제공해야하는데 이러한 경우에도 이 파일을 이용하여 쉽게 값을 전달할 수 있다.</li>
<li>Apache Tomcat을 사용하여 서버를 실행하면 기본 port 설정이 8080으로 되어 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/07d1a8df-a59f-4623-9e1f-62d2e7bb3cd0/image.png" alt=""></p>
<ul>
<li>application.properties 파일에서 server.port=8081 이렇게 설정을 하면 서버의 port 번호를 ‘8080’에서 ‘8081’로 바꿔서 실행시킬 수 있다.
<img src="https://velog.velcdn.com/images/ryan_jang/post/78363bd8-b3db-4af4-96fb-46e961de83fb/image.png" alt=""></li>
</ul>
<p>오늘은 기존의 자바프로젝트 팀 외에 알고리즘 공부팀이 새로 편성되었다.
사실 그동안 알고리즘 및 코테(코딩테스트) 강의는 몇 번 들어봤으나, 다른 강의들을 듣거나 팀프로젝트를 하는데 치중했기에, 본격적으로 제대로 시작하는 것은 이번이 처음이다.
아무래도 비전공자이다 보니 아주 기초적인 것부터 차근차근 시작할 수밖에 없었다.
그래도 기존에 자바용어를 써서 어느 정도 용법이 익숙해졌다 보니, 초반 테스트들은 그렇게 어렵지만은 않았다.
알고리즘 공부를 해보니 벌써부터 모르는 부분 및 새로 알게된 부분이 생겨서 정리해본다.</p>
<h3 id="자바에서-나머지-몫-구하기">자바에서 나머지, 몫 구하기</h3>
<p>덧셈, 뺄셈은 워낙 기초적인 부분이라 다른 방법이랄 게 없었으나, 몫과 나머지를 구하는 방법은 기존의 int 명령어를 이용하는 것 말고도 색다른 방법이 있었다. 바로 java의 기능을 쓰는 것이다.</p>
<p>일반적으로 몫은 </p>
<ul>
<li>int a = 33/10;</li>
<li>결과는 3.</li>
</ul>
<p>나머지는</p>
<ul>
<li>int b = 26%10;</li>
<li>결과는 6.</li>
</ul>
<p>라고 구하는 것이 일반적이다.
양수일 때는 int를 쓰더라도 상관없겠으나, 음수의 나머지를 구하는 경우에는 달라진다. </p>
<ul>
<li>-26%10 =&gt; -6</li>
</ul>
<p>나머지는 양수로 구하는 것이 수학적으로 옳은데, 음수가 나와버렸다.</p>
<p>그러나 다음과 같은 Math.로 시작되는 기능을 쓰면 더 엄밀하게 구할 수 있게 된다.</p>
<ul>
<li>나머지 : Math.floorMod(-26,10) =&gt; 4</li>
</ul>
<p>몫을 구하는 명령어도 있다.</p>
<ul>
<li>몫 : Math.floorDiv(33,10) = 3</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[231107 HTTP란 (YIL)]]></title>
            <link>https://velog.io/@ryan_jang/231107-HTTP%EB%9E%80-YIL</link>
            <guid>https://velog.io/@ryan_jang/231107-HTTP%EB%9E%80-YIL</guid>
            <pubDate>Thu, 09 Nov 2023 10:34:42 GMT</pubDate>
            <description><![CDATA[<h2 id="http">HTTP</h2>
<h3 id="httphypertext-transfer-protocol란">HTTP(HyperText Transfer Protocol)란?</h3>
<ul>
<li>데이터를 주고 받는 양식을 정의한 &quot;통신 규약&quot;중 하나.</li>
<li>매우 범용적인 양식을 가지고 있어 전 세계에서 제일 널리 쓰이는 통신 규약.</li>
<li>통신 규약 : 컴퓨터끼리 데이터를 주고 받을 때 정해둔 약속.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/a877ef46-2a8b-4ff5-9388-69c273ba1c2f/image.png" alt=""></p>
<ul>
<li>위와 같이 모국어 대신 중국어 등 외국어로 말한다면 알아들을 수 없게 된다.</li>
<li>마찬가지로 컴퓨터끼리 데이터를 주고 받을 때 정해진 규칙없이 매번 요청하는 방식이 다르다면 소통에 큰 문제가 발생한다.</li>
<li>현재 이용되는 대부분의 웹 서버가 HTTP를 기반으로 정해준 규칙에 맞게 데이터를 주고 받는다.</li>
<li>모든 브라우저는 HTTP 프로토콜을 기본으로 지원하므로 우리는 HTTP를 매일 이용하는 셈이다.</li>
</ul>
<h3 id="http로-어떻게-데이터를-주고-받는가">HTTP로 어떻게 데이터를 주고 받는가</h3>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/44ba436e-62ea-4bc3-ad1b-c7b462928472/image.png" alt=""></p>
<h4 id="http엔-request-response라는-개념이-존재">HTTP엔 Request, Response라는 개념이 존재.</h4>
<ul>
<li>예시로 서버와 브라우저는 아래와 같이 동작한다.</li>
</ul>
<ol>
<li>브라우저는 서버에게 자신이 원하는 페이지(URL 등의 정보)를 요구(Request).</li>
<li>서버는 브라우저가 원하는 페이지가 있는지 확인하고, 있다면 해당 페이지에 대한 데이터를 실어 응답(Response).
없다면 없는 페이지에 대한 데이터를 반환.</li>
<li>브라우저는 서버에게 전달 받은 데이터를 기반으로 브라우저에 그려줌.
※ &quot;데이터&quot;는 어떠한 데이터든 가능.</li>
</ol>
<h3 id="브라우저에서의-http-동작-확인">브라우저에서의 HTTP 동작 확인</h3>
<h4 id="1-개발자-도구와-네트워크-탭-열어보기">1. 개발자 도구와 네트워크 탭 열어보기</h4>
<p>1) 원하는 웹 페이지 방문하기.
2) 브라우저에서 F12를 누르면 아래와 같은 창이 뜸. 이를 DevTool 혹은 개발자 도구라고 부름.</p>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/738b544d-5ae6-4b6b-a2e3-1051d9bac7f5/image.png" alt=""></p>
<p>3) 네트워크탭을 누름.
<img src="https://velog.velcdn.com/images/ryan_jang/post/618748eb-eeff-4839-a5b9-f3a895b9fc41/image.png" alt=""></p>
<p>4) 새로고침.
5) 아래 나오는 항목들이 브라우저가 지금 페이지를 보여주기 위해 서버에서 받아온 데이터 목록.
<img src="https://velog.velcdn.com/images/ryan_jang/post/8b114a24-f9b3-42e1-bb13-08775d5562e9/image.png" alt=""></p>
<ul>
<li>웹 개발을 진행하면서 문제가 생겼을 때 문제에 대한 분석을 위해 개발자 도구와 네트워크 탭을 사용하면 좋다.</li>
</ul>
<h4 id="2-네트워크network-탭-좌측-name-목록-아래-요청-클릭하기">2. 네트워크(Network) 탭 좌측 Name 목록 아래 요청 클릭하기</h4>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/eb9ce7a5-c770-490a-9592-a0e71a499baf/image.png" alt=""></p>
<h4 id="3-headers-탭-살펴보기">3. Headers 탭 살펴보기</h4>
<h4 id="general">General</h4>
<ul>
<li>브라우저에서 서버로 보낸 일종의 Request 데이터.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/803b173d-9272-4bd0-8104-ebcc113a0312/image.png" alt=""></p>
<ul>
<li><p>Status Code 200은 ‘요청이 성공했다’라는 뜻을 의미.</p>
</li>
<li><p>HTTP 상태 코드(Status Code)를 통해 브라우저와 서버간의 요청, 응답 과정에서 발생할 수 있는 상황들을 표현할 수 있
다.</p>
</li>
<li><ul>
<li>HTTP 상태 코드는 3자리 숫자로 이루어짐.</li>
</ul>
</li>
<li><ul>
<li>첫 번째 자리 숫자는 상태 코드의 분류를 나타내는 용도로 사용되며, 나머지 두 자리는 세부적인 정보를 나타냄.</li>
</ul>
</li>
<li><p>1xx (Informational)</p>
</li>
<li><ul>
<li>1xx 상태 코드는 요청이 수신 되었으며 처리가 계속되고 있음을 나타냄.</li>
</ul>
</li>
<li><ul>
<li>주로 웹 브라우저와 같은 클라이언트가 서버와의 연결 상태를 확인하기 위해 사용.</li>
</ul>
</li>
<li><p>2xx (Successful)</p>
</li>
<li><ul>
<li>2xx 상태 코드는 클라이언트의 요청이 성공적으로 처리 되었음을 나타냄.</li>
</ul>
</li>
<li><ul>
<li>가장 많이 사용되는 상태 코드는 200.</li>
</ul>
</li>
<li><ul>
<li>이는 요청이 성공적으로 처리 되었으며 클라이언트가 요청한 데이터가 서버에서 제공됨을 의미.</li>
</ul>
</li>
<li><p>3xx (Redirection)</p>
</li>
<li><ul>
<li>3xx 상태 코드는 클라이언트가 추가적인 조치를 취해야 함을 나타냄.</li>
</ul>
</li>
<li><ul>
<li>이 상태 코드는 주로 페이지 이동, 리다이렉션 등에 사용.</li>
</ul>
</li>
<li><p>4xx (Client Error)</p>
</li>
<li><ul>
<li>4xx 상태 코드는 클라이언트에 오류가 있음을 나타냄.</li>
</ul>
</li>
<li><ul>
<li>이 상태 코드는 주로 클라이언트의 잘못된 요청, 인증 오류 등에 사용.</li>
</ul>
</li>
<li><ul>
<li>가장 많이 사용되는 상태 코드는 404입니다. 이는 클라이언트가 요청한 페이지나 리소스를 서버에서 찾을 수 없
음을 의미.</li>
</ul>
</li>
<li><p>5xx (Server Error)</p>
</li>
<li><ul>
<li>5xx 상태 코드는 서버에 오류가 발생했음을 나타냄.</li>
</ul>
</li>
<li><ul>
<li>이 상태 코드는 주로 서버의 오류, 서버 과부하 등에 사용.</li>
</ul>
</li>
<li><ul>
<li>가장 많이 사용되는 상태 코드는 500. 이는 서버 내부 오류가 발생함을 의미.</li>
</ul>
</li>
</ul>
<h4 id="request-headers">Request Headers</h4>
<p>-- 이것도 브라우저에서 서버로 보낸 Request 데이터라고 보면 쉽다!
<img src="https://velog.velcdn.com/images/ryan_jang/post/2d513b1e-3587-4daf-8b11-7b63c45d4b3e/image.png" alt=""></p>
<h4 id="response-headers">Response Headers</h4>
<p>-- 서버가 웹페이지 데이터와 함께 보낸 추가 데이터.
<img src="https://velog.velcdn.com/images/ryan_jang/post/6c5e24ea-8e20-468a-a66e-a42c3ccab896/image.png" alt=""></p>
<h4 id="4-response-탭-살펴보기">4. Response 탭 살펴보기</h4>
<ul>
<li>Headers 탭에서 Response 탭으로 바꾸자.</li>
<li>서버에서 내 브라우저로 반환해준 웹 페이지를 그려주기 위한 데이터이다.
<img src="https://velog.velcdn.com/images/ryan_jang/post/776b150a-5a3b-4ab5-9db4-ee4b9b6f0dbf/image.png" alt=""></li>
</ul>
<h3 id="데이터-추가-데이터-뭐가-다른가">데이터? 추가 데이터? 뭐가 다른가?</h3>
<ul>
<li>Headers 탭에서는 추가 데이터라고 많이 말했었고, Response 탭에서는 그냥 데이터라고 말했다. 차이점을 알아보자.</li>
<li>HTTP 구성 요소는 크게 다음과 같다.
<img src="https://velog.velcdn.com/images/ryan_jang/post/a29b1cab-4917-46eb-9601-4d4d8917154a/image.png" alt=""><h4 id="method-호출요청-방식">Method (호출/요청 방식)</h4>
</li>
<li>GET : 서버에 요청을 보냅니다.</li>
<li>POST : 웹 서버에 데이터를 게시할 때 사용하는게 일반적. (ex. 회원가입, 게시글 작성, 댓글 작성)</li>
<li>그 외 DELETE 등의 여러 요청 방식이 존재.</li>
<li>가장 대표적인 요청 방식이 GET 과 POST.</li>
</ul>
<h4 id="header-추가-데이터-메타-데이터">Header (추가 데이터. 메타 데이터)</h4>
<ul>
<li>브라우저가 어떤 페이지를 원하는지</li>
<li>요청 받은 페이지를 찾았는지</li>
<li>요청 받은 데이터를 성공적으로 찾았는지</li>
<li>어떤 형식으로 데이터를 보낼지
<img src="https://velog.velcdn.com/images/ryan_jang/post/6c7daa67-018d-4dcc-8157-7221cefa8689/image.png" alt=""></li>
<li>이러한 사례 외에도 아주 다양한 의사 표현을 위한 데이터를 모두 Header 필드에 넣고 주고 받음. 위에서 설명 된
메서드도 사실은 헤더에 포함되어 서버로 보내짐.</li>
</ul>
<h4 id="payload-데이터-실제-데이터">Payload (데이터. 실제 데이터)</h4>
<ul>
<li><p>서버가 응답을 보낼 때에는 항상 Payload를 보낼 수 있다.</p>
</li>
<li><p>클라이언트(브라우저)가 요청을 할 때에도 Payload를 보낼 수 있다.</p>
</li>
<li><p>&quot;GET method를 제외하곤 모두 Payload를 보낼 수 있다&quot; 는게 HTTP에서의 약속.</p>
</li>
<li><p>HTML
<img src="https://velog.velcdn.com/images/ryan_jang/post/b2d736e4-d454-46c2-aafc-2190d2630e45/image.png" alt=""></p>
</li>
<li><p>JSON
<img src="https://velog.velcdn.com/images/ryan_jang/post/7bd66708-ad11-49cd-80a4-5e93f983322c/image.png" alt=""></p>
</li>
<li><p>HTTP의 Payload를 통해 위와 같은 데이터들을 요청하고 응답 받을 수 있다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[231106 Spring 본훈련 시작(YIL)]]></title>
            <link>https://velog.io/@ryan_jang/231106-Spring-%EB%B3%B8%ED%9B%88%EB%A0%A8-%EC%8B%9C%EC%9E%91YIL</link>
            <guid>https://velog.io/@ryan_jang/231106-Spring-%EB%B3%B8%ED%9B%88%EB%A0%A8-%EC%8B%9C%EC%9E%91YIL</guid>
            <pubDate>Tue, 07 Nov 2023 02:06:01 GMT</pubDate>
            <description><![CDATA[<p>본격적으로 스프링훈련 숙련주차가 시작됐다.
스프링훈련과 함께 그동안 익숙지 않아 제대로 작성하지 못했던 TIL도 다시금 시작해보려고 한다.
일이 있거나 깜빡하거나 등 각종 이슈로 당일날 못 적고 이후에 적을 때는, TIL이라고 쓰기엔 양심에 조금 찔리니
뭉뚱그려서 YIL(YesterdayILearned)라 쓰기로 했다.
그간 못쓴 TIL도 있으니, 최근 새로 얻은 지식들을 종합해서 쓴다.</p>
<p>비전공자인 나로서는 자바도 새로 익히는 것이 어려웠으나, Java가 조금은 눈에 익을 때쯤, 이번에는 Spring이라는 도전과제가 업그레이드 되었다. 다행히 기초적인 부분부터 다시 한 번 짚어주는 느낌이었다.
그동안 인텔리J를 쓰면서도 특별한 생각없이 썼던 터미널부터 그 개념을 짚어보았다.</p>
<h4 id="터미널">터미널</h4>
<ul>
<li><p>사람은 프론트엔드(인터페이스)인 마우스로 컴퓨터에 명령을 내리지만, 컴퓨터가 익숙한&#39;명령어&#39;를 쓸 수 있는 창이다.</p>
</li>
<li><p>다만 홈브루는 처음 봤는데, 맥 유저를 위한 편의기능인 듯하다.
집에서 Spring훈련 중이라 지금은 데스크탑을 쓰지만, 감사하게도 맥 에어가 있긴 해서 집 외에 코딩을 하거나 작업을 할 때 유용한 툴일 듯 하다.</p>
</li>
</ul>
<h4 id="홈브루homebrew">홈브루(Homebrew)</h4>
<ul>
<li>맥의 편리함 중 하나. &#39;다운로드 패키지&#39;를 관리할 수 있는 툴이다. &#39;brew install 프로그램이름&#39;을 입력하면, 프로그램을 자동으로 다운로드 받아 설치해줌.</li>
</ul>
<p>깃 설정도 설명이 돼있었으나, 다행히 그간 개인프로젝트와 팀프로젝트로 이미 많이 해와서 기초적인 부분은 어느 정도 숙지가 돼있어서 넘어가기로 한다.</p>
<h3 id="서버란-무엇인가">서버란 무엇인가</h3>
<h4 id="네트워크">네트워크</h4>
<ul>
<li>네트워크는 여러대의 컴퓨터 또는 장비가 서로 연결되어서 정보를 주고 받을 수 있게 도와주는 기술.</li>
<li>컴퓨터, 라우터, 스위치, 허브 등의 장비들이 각각의 역할을 수행하여 정보를 주고 받는다.</li>
<li>서로 정보를 주고 받기 위해서는 IP 주소, 서브넷 마스크, 게이트웨이 등의 정보를 설정하고 네트워크 프로토콜을 이용
하여 통신을 하게 된다.</li>
<li>사용자의 요청에서 시작하여 우리가 만든 서버에 도착하고 다시 사용자에게 까지 되돌아가는 흐름을 잘 파악하고 있어야 서버 개발이 용이하다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/6c3303ed-5fca-4220-9334-25736a863f19/image.png" alt=""></p>
<ul>
<li>Client 즉, 브라우저에서 서버에 정보를 요청하는 과정을 간략하게 표현했다.</li>
<li>사용자는 브라우저를 이용하여 서버에 정보를 요청 후 응답을 받는다.</li>
<li>이때 사용자의 요청이 서버에 도달하기 위해서는 해당 서버의 정보가 필요. 그 요청이 해당 서버에 정확하게 도달할 수 있게 제공되는 정보가 IP 주소!</li>
<li>거대한 네트워크망에서 여러분의 컴퓨터를 식별하기 위한 위치 주소 입니다.</li>
<li>네트워크상에서의 데이터 송/수신은 이 주소를 기준으로 이루어지고 있습니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/705a5706-6427-49f7-864b-6ea42f977085/image.png" alt=""></p>
<ul>
<li>위와 같이 우리가 택배를 받기 위해서는 택배를 받을 실제 주소와 받는 사람을 알려줘야 한다.</li>
<li>네트워크에서도 정보를 요청 받고 전달하려면 주소에 해당하는 IP와 받는 사람에 해당하는 포트번호를 알려줘야 한다.</li>
</ul>
<p>그동안 컴퓨터 및 인터넷을 오래 사용하기도 했고 게임, 웹서핑 등으로 IP 주소에 대해서는 굉장히 익숙했는데, 네트워크의 개념으로 의미를 엄밀히 살펴 보니 확실히 개념을 정립할 수 있었다.</p>
<h4 id="웹-서버">웹 서버</h4>
<ul>
<li>인터넷을 통해 HTTP를 이용하여 웹상의 클라이언트의 요청을 응답해주는 통신을 하는 일종의 컴퓨터.</li>
<li>이메일이나 SNS 등 대부분의 서비스는 웹 서버를 통해 사용 가능.</li>
<li>웹 서버의 기본 동작 원리는 다음과 같다.
<img src="https://velog.velcdn.com/images/ryan_jang/post/e30872b1-8ed4-4737-a36c-34fd93dc9566/image.png" alt=""><ol>
<li>브라우저를 통해 HTTP Request로 웹사이트를 웹서버에 요청.</li>
<li>이후 웹서버는 요청을 승인하고 HTTP Response를 통해 웹사이트 데이터를 브라우저에 전송.</li>
<li>마지막으로 브라우저는 서버에서 받아온 데이터를 이용해 웹사이트를 브라우저에 그려냄.</li>
</ol>
</li>
<li>기본적으로 브라우저가 웹서버에 요청을 할때는 항상 GET method로 요청하게 됩니다.</li>
</ul>
<p>GET method는 그간 코딩을 통해 꽤나 익숙해진 방식이다. 웹 서버 설명에서 보니 왠지 반가웠다. 핵심적인 기능을 이미 알고 있는 거 같아 왠지 더 자신감이 생긴다.</p>
<h4 id="api">API</h4>
<ul>
<li>API : Application Programming Interface</li>
<li>다른 소프트웨어 시스템과 통신하기 위해 따라야 하는 규칙을 정의함.</li>
<li>개발자는 &#39;다른 애플리케이션&#39;이 프로그래밍 방식으로 애플리케이션과 통신할 수 있도록 API를 표시하거
나 생성함.</li>
<li>인터페이스(interface)는 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점
이나 경계면을 의미함.
즉, 사용자가 기기를 쉽게 동작시키는데 도움을 주는 시스템을 의미합니다.</li>
</ul>
<p>코딩하는 동안 굉장히 자주 보았던 API에 대해 드디어 본격적으로 배우게 되었다. 그 전에는 전공자 및 이미 협업이나 코딩에 익숙한 팀원들의 도움을 받아 API 관련 코딩을 구현했다면, 이번에는 그 역량을 스스로 갖출 기회가 온 것이다.
✔ 쉽게 표현해보자면 API는 하나의 &#39;약속&#39;이라고 한다. 
✔ 서로 다른 애플리케이션이, 약속한 방식의 API 요청을 수행하면 정해진 결과물을 반환.
✔ 주문을 받으면 해당 주문의 음식을 가져다 주는 식당의 점원이라 보면 된다.</p>
<h4 id="restful-api">RESTful API</h4>
<ul>
<li>Representational State Transfer(REST)는 &#39;API 작동 방식에 대한 조건을 부과하는&#39; 소프트웨어 아키
텍처.</li>
<li>REST는 처음에 인터넷과 같은 복잡한 네트워크에서 통신을 관리하기 위한 지침으로 만들어짐. </li>
<li>REST 아키텍처 스타일을 따르는 API를 REST API라고 한다. </li>
<li>REST 아키텍처를 구현하는 웹 서비스를 RESTful 웹 서비스라고 한다.</li>
</ul>
<p>API면 API지, RESTful은 또 뭐란 말인가? 잠시 쉬어갈 수 있게 만든 인터페이스인가? 싶었는데 REST가 대문자인 이유가 있었다.
Representational State Transfer의 약자였던 것.</p>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/7f1be6bc-f534-4bf7-b643-71eead57294b/image.png" alt=""></p>
<ul>
<li>위와 같은 구성요소에 따라 API의 리소스 식별자를 중복 없이 고유하게 잘 만들고, 해당 API에 적절하게 HTTP 메서드를 사용했다면, RESTful하게 설계했다고 볼 수 있다.</li>
</ul>
<h3 id="apache-tomcat">Apache Tomcat</h3>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/33d9106e-93aa-4f0b-9a2e-5fe5a8c7786b/image.png" alt=""></p>
<h4 id="web-server-와-web-application-serverwas">Web Server 와 Web Application Server(WAS)</h4>
<ul>
<li>브라우저에서 URL을 입력하여 어떠한 페이지를 요청했을 때 HTTP의 요청을 받아들여 HTML 문서와 같은 정적인 콘텐츠를
사용자에게 전달해주는 역할을 하는 것이 Web Server.</li>
</ul>
<h4 id="웹-서버의-역할-2가지">웹 서버의 역할 2가지</h4>
<ol>
<li>정적인 콘텐츠 즉, 이미 완성이 되어있는 HTML과 같은 문서를 브라우저로 전달.</li>
<li>브라우저로부터 ‘로그인하여 MyPage를 요청’과 같은 동적인 요청이 들어왔을 때, 웹 서버 자체적으로 처리하기 어렵기
때문에 해당 요청을 WAS에 전달.</li>
</ol>
<ul>
<li>종류로는 Apache, Nginx 등이 있음.</li>
<li>WAS는 웹 서버와 똑같이 HTTP 기반으로 동작.</li>
<li>웹 서버에서 할 수 있는 기능 대부분을 WAS에서도 처리 가능.</li>
<li>WAS를 사용하면 로그인,회원가입을 처리하거나 게시물을 조회하거나 정렬하는 등의 다양한 로직들을 수행하는 프로그램을
동작시킬 수 있다.</li>
<li>종류로는 Tomcat, JBoss 등이 있음.</li>
</ul>
<h4 id="apache-tomcat이란">Apache Tomcat이란?</h4>
<ul>
<li>Tomcat은 동적인 처리를 할 수 있는 웹 서버를 만들기 위한 웹 컨테이너.
<img src="https://velog.velcdn.com/images/ryan_jang/post/3f9073f8-0cda-47e6-9c50-27311d70e0fe/image.png" alt=""></li>
<li>Apache Tomcat이란 Apache와 Tomcat이 합쳐진 형태로 정적인 데이터 처리와 동적인 데이터 처리를 효율적으로 해줄 수
있다.</li>
</ul>
<p>본격적으로 웹서버에 대해 배우게 됐다. 그동안 인터넷을 하며 이미 친숙한 단어이긴 하지만, 어떠한 원리와 방식으로 구동되는지에 대해 더 구체적으로 알 수 있었다.</p>
<h3 id="springboot와-spring">SpringBoot와 Spring</h3>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/5082ca14-724b-4fa9-bf1d-458d1df2c667/image.png" alt=""></p>
<ul>
<li>Spring 프레임워크는 2004년에 1.0이 등장한 이후 20년가까이 사랑받으며 계속해서 업그레이드 해온 현재는 Spring 6.0이
등장한 아주 오래되고 강력한 프레임워크.
<img src="https://velog.velcdn.com/images/ryan_jang/post/507511d6-d52c-401e-9765-3e851b144969/image.png" alt=""></li>
<li>Spring 프레임워크는 AOP, IoC/DI 등과 같은 아주 강력한 핵심 기능들을 가지고 있다.</li>
<li>하지만 이러한 핵심 기능들을 사용하기 위해서는 너무나도 많은 xml 설정들이 필요했다.</li>
<li>이러한 불편한 점들을 개선하기 위해 2014년 SpringBoot가 등장.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/9137032e-23b9-4135-8362-9412ccf55601/image.png" alt=""></p>
<ul>
<li>SpringBoot는 기존의 xml 설정 대신 Java의 애너테이션 기반의 설정을 적극적으로 사용하고 있기 때문에 무겁고 작성하기
힘들던 xml 대신에 애너테이션을 사용하여 아주 간편하게 설정할 수 있다.</li>
<li>기본적으로 개발에 필요한 설정 정보들을 일반적으로 많이 사용하는 설정 값을 default로 하여 자동으로 설정해주고 있다.</li>
<li>외부 라이브러리나 하위 프레임워크들의 의존성 관리가 매우 쉬워졌다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/2990aeb5-37ca-4b74-a3e1-acd90e9e63d0/image.png" alt=""></p>
<ul>
<li>기존에는 외부 라이브러리와 프레임워크를 사용하기 위해서 각각의 버전들의 호환성을 직접 확인해가면서 의존성들을 설정함.</li>
<li>반면 SpringBoot에서는 spring-boot-starter-web 처럼 필요한 외부 라이브러리들과 프레임워크들을 의존성에 맞게
starter로 묶어서 제공.</li>
<li>이전처럼 각각의 버전 호환성을 직접 확인할 필요가 없어짐.</li>
<li>마지막으로 SpringBoot의 강력한 점 중 하나가 바로 내장 Apache Tomcat.
<img src="https://velog.velcdn.com/images/ryan_jang/post/04cd9afa-6768-4df6-988e-b5e4ebc00831/image.png" alt=""></li>
<li>Spring 프레임워크에서는 서버를 실행시키기 위해 Apache Tomcat을 직접 다운로드 받고 설정하고 프로젝트에 삽입 했어야
했다.
<img src="https://velog.velcdn.com/images/ryan_jang/post/585c49e0-c08a-4d41-812f-d61a7b210887/image.png" alt=""></li>
</ul>
<ul>
<li>이러한 불편함을 해결하기 위해 SpringBoot에서는 기본적으로 starter-web dependency를 설정하면 자동으로 내장형
Apache Tomcat을 제공해 줌.</li>
<li>말 그대로 Apache Tomcat이 내장되어 있기 때문에 개발자가 따로 다운로드 받고 설정하고 삽입할 필요없이 바로 사용가능.</li>
</ul>
<p>드디어 스프링의 개념에 대해 배우게 되었다. 실질적으로 &#39;스프링&#39;이라 함은, 그냥 스프링이 아니라 개선된 버전인 스프링부트를 일컫는다는 것 또한 알게 됐다.</p>
<p>그동안 자바훈련이 기초라고 했던 것이 이해가 된다. 이제 제대로 스프링을 배워볼 시간이 온 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[231005 TIL]]></title>
            <link>https://velog.io/@ryan_jang/231005-TIL</link>
            <guid>https://velog.io/@ryan_jang/231005-TIL</guid>
            <pubDate>Thu, 05 Oct 2023 23:16:02 GMT</pubDate>
            <description><![CDATA[<p>어제에 이어 본격적으로 분업 및 협업을 하기로 함.</p>
<p>와이어프레임(Miro) 추가 수정 후 코딩 시작.</p>
<p>준영님이 메인페이지 전반적 디자인 및 관리자 페이지 모달팝업 연결, 파이어베이스 담당</p>
<p>승준님이 메인페이지 헤드 가시성 코딩 및 팝업  여러 필요한 부분 코딩 지원.</p>
<p>해인님이 디자인 및 방명록 위주로 코딩.</p>
<p>건우님이 관리자페이지 디자인 및 입력 기능 추가.</p>
<p>내가 멤버 디자인페이지를 맡음.</p>
<p><img src="https://velog.velcdn.com/images/ryan_jang/post/ffa5571b-e73f-4080-bca1-76cdee24f241/image.jpg" alt=""></p>
<ul>
<li>문제점 봉착</li>
</ul>
<ol>
<li>원 모양이 찌그러짐</li>
</ol>
<p>-&gt; CSS를 통해 최대한 비슷한 디자인을 구현하려다 보니 div별로 margin, padding을 자주 썼고, 그로 인해 원이 타원으로 찌그러지게 됨. margin 및 padding의 비율을 줄이거나 아예 없애고 혹은 비율을 고정하는 방법을 생각해봤으나, 오히려 코드가 꼬여서 기존 디자인까지 망가짐. 아직 완벽히 해결되지 않음. 간격을 줄이는 다른 태그 등 명령어를 공부해봐야할 듯.</p>
<ol start="2">
<li>모달팝업 연결이 어려움</li>
</ol>
<p>-&gt; 최대한 와이어프레임 구상에 근접하게 css코딩으로 디자인하고 보니, 디자인을 모달팝업에 이식하는 것이 생각보다 난이도가 높음.
-&gt; 처음엔 모달팝업 외에 다른 명령어로 새 창이 뜨는 효과를 구현할 수 있다고 생각해서 디자인부터 했으나, 애초에 모달팝업을 생각했다면 &#39;디자인 -&gt; 모달팝업 구현&#39;이 아니라, &#39;모달팝업 디자인 -&gt; 실행&#39;으로 하는 것이 더 수월한 작업이었을 것이라는 것이 결론.</p>
<ul>
<li>작업진행율
전체적으로 팀원들이 코딩에 능숙해서 첫날 약 70~80%의 완성도 달성. 추후 디테일 및 기능적인 부분을 추가하는 과정을 거치면 마감기한 내에 충분히 제출가능할 것이라 예상함.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[231004 TIL]]></title>
            <link>https://velog.io/@ryan_jang/231004-TIL</link>
            <guid>https://velog.io/@ryan_jang/231004-TIL</guid>
            <pubDate>Wed, 04 Oct 2023 22:58:30 GMT</pubDate>
            <description><![CDATA[<p><strong>개발자로서의 본격적인 첫걸음</strong></p>
<p>// GIT //</p>
<p>오전은 GIT 및 Github에 관하여 배웠다.</p>
<ul>
<li><p>GIT이란 : 버전 관리 도구</p>
<ul>
<li>코드 변경점 기록</li>
</ul>
</li>
<li><p>GIT의 사용목적? : 하나의 폴더 내에서 코드의 변경점을 기록하기 위함. </p>
</li>
<li><p>Github란 :  온라인 저장소</p>
<ul>
<li>내 코드를 온라인 백업 및 타인과 협업 가능</li>
</ul>
</li>
<li><p>Github의 장점?
1) 내 코드를 온라인 저장소에 백업 가능
2) 협업시 팀원간 코드 공유 가능
3) 동시에 작업 가능</p>
</li>
</ul>
<p>*필수 git 명령어 리스트(리눅스에서 유래)</p>
<ol>
<li><code>git init</code><ul>
<li>프로그래밍을 git으로 관리하기 위해 딱 한 번만 입력하면 되는 명령어</li>
</ul>
</li>
<li><code>git add &lt;파일명&gt;</code>  혹은 <code>git add .</code><ul>
<li>저장하고 싶은 파일을 지정하는 것</li>
<li>add 뒤에 점(.)은 현재 폴더(디렉토리)에 있는 모든 파일들을 의미</li>
</ul>
</li>
<li><code>git commit -m &quot;기능 개발과 관련된 기록&quot;</code><ul>
<li>실제로 저장하는 명령어</li>
</ul>
</li>
<li><code>git status</code><ul>
<li>어떤 파일이 add 됐는지, 어떤 파일이 변경됐는지, 현재 브랜치명 확인 등 확인 가능한 명령어</li>
</ul>
</li>
<li><code>git log</code><ul>
<li>내가 저장한 커밋 내역 확인</li>
</ul>
</li>
<li><code>git push</code><ul>
<li>github에 코드를 업로드할 때 git push origin &lt;브랜치명&gt;의 형태로 쓰인다.</li>
</ul>
</li>
<li><code>git clone</code><ul>
<li>github에 있는 프로젝트를 복제해오는 명령어</li>
</ul>
</li>
<li><code>git pull</code> <ul>
<li>온라인 저장소에서 변경된 코드를 적용</li>
</ul>
</li>
</ol>
<ul>
<li>컨플릭트(Conflict) 해결법
<code>git pull</code> 시 발생하는 <strong>conflict</strong>를 해결하는 법</li>
</ul>
<ol>
<li><code>&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</code> 삭제</li>
<li><code>=======</code> 삭제</li>
<li><code>&gt;&gt;&gt;&gt;&gt;&gt;&gt; 4182….</code> 삭제</li>
<li>원하는 코드로 수정 <ul>
<li>코드를 변경한 팀원과 상의하는 것을 추천</li>
</ul>
</li>
</ol>
<p>오후는 팀명 &#39;개발자취&#39;를 정하고 팀원끼리 소개하는 시간을 가졌으며, 파이어베이스를 중심으로 한 개발자 기초강의를 듣고 첫 팀프로젝트(프로젝트명 &#39;개발자국&#39;)인 팀원 소개 페이지를 위한 와이어프레임을 함께 구상하였다.</p>
<p>&lt;&lt; 과제 세부사항 &gt;&gt;</p>
<ul>
<li>프로젝트 주제 및 포함 내용<ol>
<li>[팀]과 [자신]에 대한 설명 및 MBTI </li>
<li>객관적으로 살펴본 자신의 장점</li>
<li>자신의 스타일 협업 스타일 소개</li>
<li>우리 팀만의 특징과 추구하는 궁극적인 목표</li>
<li>우리 팀의 약속</li>
<li>팀원들의 블로그 주소</li>
</ol>
</li>
<li>최종 제출 : 10/11 (수) 11:00</li>
<li>발표 : 10/11 (수) 14:00</li>
</ul>
<p>// 팀플 - 와이어프레임 //</p>
<ul>
<li>Miro라는 와이어프레임도구를 사용.</li>
<li>프로젝트 포함 내용을 중심으로 전체적인 틀과 세부디자인을 정했다.</li>
<li>팝업창의 연동 및 구상을 했다.</li>
<li>협업 및 실제 코드 작성은 다음날부터 하기로.</li>
</ul>
<p>// 알고리즘 공부 //</p>
<ul>
<li>코딩테스트 및 코드 언어의 능숙함을 위하여 팀원끼리 매일 알고리즘 공부하는 시간을 짧게 가지기로 했다. 첫날이고 와이어프레임에 시간을 많이 쏟은 관계로 기초 알고리즘만 맛보기로 확인했다.</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>