<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>acacia__u.log</title>
        <link>https://velog.io/</link>
        <description>게으른 개발자의 부지런한 개발일지</description>
        <lastBuildDate>Mon, 10 Oct 2022 13:08:22 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>acacia__u.log</title>
            <url>https://velog.velcdn.com/images/acacia__u/profile/217f36de-2ae1-407b-b0e8-f3451b8ea274/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. acacia__u.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/acacia__u" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Java] SOLID원칙]]></title>
            <link>https://velog.io/@acacia__u/Java-SOLID%EC%9B%90%EC%B9%99</link>
            <guid>https://velog.io/@acacia__u/Java-SOLID%EC%9B%90%EC%B9%99</guid>
            <pubDate>Mon, 10 Oct 2022 13:08:22 GMT</pubDate>
            <description><![CDATA[<h2 id="객체지향-설계의-5원칙--solid">객체지향 설계의 5원칙 : SOLID</h2>
<p> 단일 책임 원칙:   <strong><code>SRP</code></strong> (Single Responsibility Principle) 
 개방 폐쇄 원칙:  <strong><code>OCP</code></strong> (Open Closed Priciple) 
리스코프 치환 원칙:   <strong><code>LSP</code></strong> (Listov Substitution Priciple) 
 인터페이스 분리 원칙:  <strong><code>ISP</code></strong> (Interface Segregation Principle) 
 의존 역전 원칙:   <strong><code>DIP</code></strong> (Dependency Inversion Principle) </p>
<h3 id="1-srp">1. SRP</h3>
<p>** -  단일 책임 원칙**</p>
<blockquote>
<p>어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.<br>-로버트 C.마틴</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/af0022d2-f0b1-4ee9-8a7d-126b194ac899/image.jpeg" alt="">
다음 그림과 같은 클래스가 있다고 가정해볼때, 이 남자의 역할과 책임이 많은 것을 확인 할 수 있다.
예를 들어, 어느 날, 여자친구와 헤어졌다면 기념일 챙기기 및 키스하기가 어렵다. 
거기에 여자친구 없는 스트레스가 주변 사람에게도 영향을 미치게 될 것이다.</p>
<p>이런 경우 <strong>역할 (책임)을 분리</strong>하는 것이 필요하다.</p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/67253a60-19ad-425d-ac06-71ceb8d579e2/image.jpeg" alt=""></p>
<br>

<h4 id="메소드가-단일-책임을-지키지-않은-경우"><strong>메소드가 단일 책임을 지키지 않은 경우</strong></h4>
<pre><code class="language-java">class 강아지 {
    final static Boolean 수컷 = true;
    final static Boolean 암컷 = false;
    Boolean 성별;

    void 소변보다() {
        if (this.성별 == 수컷) {
            // 한쪽 다리를 들고 소변을 보다.
        } else {
            // 뒷다리 두 개를 굽혀 앉은 자세로 소변을 본다.
        }
    }   
}</code></pre>
<p>강아지 클래스 소변보다()가 수컷, 암컷 강아지의 행위를 모두 구현하기 위해 분기 처리를 위한 if문의 사용으로 단일 책임(행위) 원칙을 위배하고 있다.
<br></p>
<h4 id="메소드에-단일-책임-원칙을-적용한-경우"><strong>메소드에 단일 책임 원칙을 적용한 경우</strong></h4>
<pre><code class="language-java">abstract class 강아지 {
    abstract void 소변보다();
}

class 수컷강아지 extends 강아지 {
    void 소변보다() {
        // 한쪽 다리를 들고 소변을 본다.
    }
}

class 암컷강아지 extends 강아지 {
    void 소변보다() {
        // 뒷다리 두 개로 앉은 자세로 소변을 본다.
    }
}</code></pre>
<p>추상 클래스 강아지를 두고 수컷강아지, 암컷강아지 클래스가 각자 자신의 특징에 맞게 소변보다() 메소드를 구현해 단일 책임 원칙을 적용했다.
<br>
<br></p>
<h3 id="2-ocp">2. OCP</h3>
<p><strong>- 개방 폐쇄 원칙</strong></p>
<blockquote>
<p>소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야한다
-로버트 C.마틴</p>
</blockquote>
<p>위 문장을 조금 더 의역해보자면?</p>
<p><strong>&quot;자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다&quot;</strong></p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/8457b91c-3403-4a66-bde8-b3c01118f462/image.png" alt=""></p>
<p>위 그림에서 운전자는 기어가 수동 or 자동이냐에 따라 행동이 달라진다.
어떤 변화가 운전자에게 영향을 미치고 있어 <strong>개방 폐쇄 원칙에 위배</strong>된다는 것이다.</p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/875da233-ca1d-4d6e-a9af-475aaf740fb1/image.png" alt=""></p>
<p>그림과 같이 상위 클래스 또는 인터페이스를 중간에 둠으로써 다양한 자동차가 생긴다 해도 객체 지향 세계의 운전자는 운전 습관에 영향을 받지 않게 된다.</p>
<p>즉,</p>
<p>다양한 자동차가 생긴다는 것은 자동차 입장에서 자신의 확장에는 개방되어 있는 것이고, 운전자 입장에서는 주변의 변화에 폐쇄돼 있는 것이다.</p>
<h4 id="데이터베이스의-개방-폐쇄-원칙의-아주-좋은-예">데이터베이스의 개방 폐쇄 원칙의 아주 좋은 예</h4>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/eb063037-24ba-47b3-bd41-c58acd94d235/image.png" alt=""></p>
<p>JDBC는 개방 폐쇄 원칙의 가장 좋은 예이다.
데이터베이스가 MySQL에서 오라클로 바뀌더라도 Connection을 설정하는 부분만 변경해주면 된다.</p>
<p>자바 애플리케이션은 데이터베이스라고 하는 주변의 변화에 닫혀 있는 것이고, 데이터베이스를 교체한다는 것은 데이터베이스가 자신의 확장에는 열려 있다는 것 이다.</p>
<br>
<br>

<h3 id="3-lsp">3. LSP</h3>
<p><strong>- 리스코프 치환 원칙</strong></p>
<blockquote>
<p>서브 타입은 언제나 자신의 기반 타입(base type)으로 교체할 수 있어야 한다
-로버트 C.마틴</p>
</blockquote>
<pre><code>* 하위 클래스 is a kind of 상위 클래스
&gt;  하위 분류는 상위 분류의 한 종류다. </code></pre><pre><code>* 구현 클래스 is able to 인터페이스
&gt; 구현 분류는 인터페이스할 수 있어야 한다.</code></pre><p>위 두개의 문장대로 구현된 프로그램이라면 이미 리스코프 치환 원칙을 잘 지키고 있다.</p>
<br>

<p><strong>리스코프 치환 원칙 위반 사례</strong>
<code>계층도 / 조직도</code>
<img src="https://velog.velcdn.com/images/acacia__u/post/3402584c-9882-4bf4-8091-6e7bed22e1dc/image.jpeg" alt=""></p>
<p>딸이 아버지, 할아버지 역할을 하는 것이 논리에 맞지 않는다.</p>
<br>

<p><strong>리스코프 치환 원칙 적용 사례</strong></p>
<p><code>분류도</code></p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/62dfd578-d0c4-48c5-81f9-23b0329af3d9/image.jpeg" alt="">
하위의 것들이 상위 것들의 역할을 하는 데 전혀 문제가 없다.</p>
<ul>
<li>리스코프 치환 원칙은 객체 지향의 상속이라는 특성을 올바르게 활용하면 자연스럽게 얻어지는 것이다.<br>
<br>

</li>
</ul>
<h3 id="isp">ISP</h3>
<p><strong>- 인터페이스 분리 원칙</strong></p>
<blockquote>
<p>클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다.
-로버트 C.마틴</p>
</blockquote>
<p>SRP에서는 남자 클래스를 분리해 하나의 역할(책임)만 하는 다수의 클래스로 분할한다.</p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/e1f26b47-e186-41d9-898b-c729749d3fb7/image.jpeg" alt=""></p>
<p>하지만, ISP에서는 각 역할에 맞게 <strong>인터페이스로 분리</strong>하여 사용할 수 있다.</p>
<p>(ex 어머니한테는 아들, 여자친구한테는 남자친구)
<img src="https://velog.velcdn.com/images/acacia__u/post/7b81ac54-7801-490c-9fce-c61bfc53bbf5/image.jpeg" alt=""></p>
<blockquote>
<p>결론적으로는 단일 책임 원칙(SRP)과 인터페이스 분할 원칙(ISP)은 같은 문제에 대한 두 가지 다른 해결책이라고 볼 수 있다.
<br>하지만 특별한 경우가 아니라면 단일 책임 원칙을 적용하는 것이 더 좋은 해결책이라고 할 수 있다.</p>
</blockquote>
<h4 id="인터페이스-최소주의-원칙">인터페이스 최소주의 원칙</h4>
<p>인터페이스 내에 메소드는 최소한 일수록 좋다.
<br>
<br></p>
<h3 id="dip">DIP</h3>
<p><strong>- 의존 역전 원칙</strong></p>
<blockquote>
<p>고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다. 추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다.자주 변경되는 구체(Concrete) 클래스에 의존하지 마라 
-로버트 C.마틴 </p>
</blockquote>
<p><strong>의존 역전 원칙 적용 전</strong></p>
<p>자주 변경되는 구체 클래스에 의존하는 경우
<img src="https://velog.velcdn.com/images/acacia__u/post/801b8b81-a3a2-471f-89a4-9f1a25026ba8/image.png" alt="">
자동차가 타이어에 의존하면? 
자동차 타이어는 자주 바뀌게 되는 것 중 하나로, 이렇게 자주 바뀌는 것에 의존하면 자동차는 영향을 받게 되어 있다.</p>
<br>

<p><strong>의존 역전 원칙 적용 후</strong>
<img src="https://velog.velcdn.com/images/acacia__u/post/0a346efa-3704-45cd-a91b-1bf835fd9ca4/image.png" alt=""></p>
<p>자동차가 구체적인 타이어가 아닌 추상화된 타이어 인터페이스에만 의존하게 함으로써 타이어가 변경되어도 자동차가 영향을 받지 않는다.</p>
<br>

<p>자신보다 변하기 쉬운 것에 <strong>의존하던 것</strong>을 <strong>추상화된 인터페이스</strong>나 <strong>상위 클래스</strong>를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 것이 DIP 의존 역전 원칙이다.</p>
<hr>
<p><strong>📚 Reference</strong></p>
<blockquote>
<p><a href="http://www.yes24.com/Product/Goods/17350624">스프링 입문을 위한 자바 객체지향의 원리와 이해</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring Boot](게시판) | 수정 , 삭제 API 구현하기]]></title>
            <link>https://velog.io/@acacia__u/Spring-Boot%EA%B2%8C%EC%8B%9C%ED%8C%90-%EC%88%98%EC%A0%95-%EC%82%AD%EC%A0%9C-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@acacia__u/Spring-Boot%EA%B2%8C%EC%8B%9C%ED%8C%90-%EC%88%98%EC%A0%95-%EC%82%AD%EC%A0%9C-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 05 Oct 2022 02:07:57 GMT</pubDate>
            <description><![CDATA[<h1 id="springboot-jpa로-게시판-구현하기">SpringBoot JPA로 게시판 구현하기</h1>
<h3 id="💻-개발환경">💻 개발환경</h3>
<p><code>IntelliJ ultimate</code> , <code>SpringBoot</code> , <code>Java 1.8</code> , <code>Gradle</code>, <code>jar</code> , <code>JPA</code> , <code>H2</code></p>
<h3 id="👩🏫-개발목표">👩‍🏫 개발목표</h3>
<ul>
<li>H2 (DB)를 연동해 생성, 조회, 저장, 삭제 등 RESP API를 개발한다.</li>
<li>전송 데이터 타입은 json이다.</li>
<li>호출 테스트는 브라우저나 ARC를 이용한다.</li>
</ul>
<br>

<p><strong>들어가기에 앞서</strong></p>
<p>이번 포스팅은 미리 프로젝트를 생성하고, 다음 의존성을 추가한 상태에서 시작합니다.  </p>
<ul>
<li>Lombok</li>
<li>Spring Web</li>
<li>Spring Data Jpa</li>
<li>H2 Database</li>
<li>MySQL Driver</li>
</ul>
<hr>
<h2 id="📝-수정-api--update">📝 수정 API  (Update)</h2>
<h3 id="boardcontroller">BoardController</h3>
<p><code>@PutMapping</code></p>
<p><strong>수정할 데이터</strong>가 가지고 있는 <strong>id값</strong>과 수정할 <strong>데이터</strong>를 받아서 파라미터로 전달
파라미터 값을 Service의 <strong>update메소드</strong>로 싣어 보냄
결과값을 <strong>responseDto</strong>에 담아 클라이언트 쪽에 반환</p>
<pre><code class="language-java">    @PutMapping(&quot;/api/board/{id}&quot;)
    public BoardResponseDto update(@PathVariable Long id, @RequestBody BoardRequestDto requestDto){
        return boardService.update(id, requestDto);
    }</code></pre>
<h3 id="boardservice">BoardService</h3>
<p><strong>BoardRepository</strong>에서 <strong>해당 id값과 일치하는 데이터</strong>를 찾아 board에 저장</p>
<blockquote>
<p>못찾을 경우 :  <code>에러</code>
찾는 경우 : <code>Board Entity</code>의 <code>update</code>메소드에 입력받은 데이터를 파라미터로 전달</p>
</blockquote>
<p>새로 정의된 board를  <strong>responseDto</strong>로 생성</p>
<pre><code class="language-java">    @Transactional
    public BoardResponseDto update(Long id, BoardRequestDto requestDto){
        Board board = boardRepository.findById(id).orElseThrow(
                () -&gt; new IllegalArgumentException(&quot;아이디값이 없습니다&quot;)
        );

        board.update(requestDto);
        return new BoardResponseDto(board);
} 
</code></pre>
<h2 id="📝-삭제-api--delete">📝 삭제 API  (Delete)</h2>
<p><code>@DeleteMapping</code></p>
<p><strong>삭제할 데이터</strong>가 가지고 있는 <strong>id값</strong>을 <strong>url</strong>로 받아서 전달
id 값을 Service의 <strong>delete메소드</strong>에 싣어 보냄
결과값을 <strong>responseDto</strong>에 담아 클라이언트 쪽에 반환</p>
<pre><code class="language-java">  @DeleteMapping(&quot;/api/board/{id}&quot;)
    public BoardResponseDto delete(@PathVariable Long id){
        return boardService.delete(id);
    }
}</code></pre>
<h3 id="boardservice-1">BoardService</h3>
<p><strong>BoardRepository</strong>에서 <strong>해당 id값과 일치하는 데이터</strong>를 찾아 삭제</p>
<p> <strong>responseDto</strong>를 생성 해주어 리턴</p>
<pre><code class="language-java">    public BoardResponseDto delete(Long id){
        boardRepository.deleteById(id);
        return new BoardResponseDto();
    }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SpringBoot](게시판) | 등록, 조회 API 구현하기 1]]></title>
            <link>https://velog.io/@acacia__u/Spring-Boot%EA%B2%8C%EC%8B%9C%ED%8C%90-%EC%83%9D%EC%84%B1-%EC%A1%B0%ED%9A%8C-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@acacia__u/Spring-Boot%EA%B2%8C%EC%8B%9C%ED%8C%90-%EC%83%9D%EC%84%B1-%EC%A1%B0%ED%9A%8C-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 03 Oct 2022 15:04:06 GMT</pubDate>
            <description><![CDATA[<h1 id="springboot-jpa로-게시판-구현하기">SpringBoot JPA로 게시판 구현하기</h1>
<h3 id="💻-개발환경">💻 개발환경</h3>
<p><code>IntelliJ ultimate</code> , <code>SpringBoot</code> , <code>Java 1.8</code> , <code>Gradle</code>, <code>jar</code> , <code>JPA</code> , <code>H2</code></p>
<h3 id="👩🏫-개발목표">👩‍🏫 개발목표</h3>
<ul>
<li>H2 (DB)를 연동해 등록, 조회, 저장, 삭제 등 RESP API를 개발한다.</li>
<li>전송 데이터 타입은 json이다.</li>
<li>호출 테스트는 브라우저나 ARC를 이용한다.</li>
</ul>
<br>

<p><strong>들어가기에 앞서</strong></p>
<p>이번 포스팅은 미리 프로젝트를 생성하고, 다음 의존성을 추가한 상태에서 시작합니다.  </p>
<ul>
<li>Lombok</li>
<li>Spring Web</li>
<li>Spring Data Jpa</li>
<li>H2 Database</li>
<li>MySQL Driver</li>
</ul>
<hr>
<h3 id="boardjava">Board.java</h3>
<pre><code class="language-java">@NoArgsConstructor
@Getter
@Entity
public class Board extends Timestamped {

    @JsonIgnore
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(length = 50, nullable = false)
    private String title;

    @Column(length = 200, nullable = false)
    private String content;

    @Column(length = 100, nullable = false)
    private String username;

    @JsonIgnore
    @Column(nullable = false)
    private String password;

    public Board(BoardRequestDto requestDto) {
        this.title = requestDto.getTitle();
        this.username = requestDto.getUsername();
        this.content = requestDto.getContent();
        this.password = requestDto.getPassword();
    }

    public void update(BoardRequestDto requestDto) {
        this.title = requestDto.getTitle();
        this.username = requestDto.getUsername();
        this.content = requestDto.getContent();
        this.password = requestDto.getPassword();

    }
}
</code></pre>
<h3 id="boardrepository">BoardRepository</h3>
<p><em>저장된 Board들을 찾을 수 있는 공간 역할 !</em></p>
<pre><code class="language-java">public interface BoardRepository extends JpaRepository&lt;Board, Long&gt; {

    List&lt;Board&gt; findAllByOrderByCreatedAtDesc();

}
</code></pre>
<h3 id="boardrequestdto">BoardRequestDto</h3>
<p><em>Board에 추가할 데이터를 입력할 때, 담을 그릇 역할 !</em></p>
<pre><code class="language-java">@Getter
public class BoardRequestDto {
    private String password;
    private String title;
    private String username;
    private String content;
    private LocalDateTime createdAt;
}
</code></pre>
<h3 id="boardresponsedto">BoardResponseDto</h3>
<p><em>Board에서 값을 가져올 때, 담을 그릇 역할 !</em>
<em>password같은 정보는 노출시키지 않기위해 필드로 넣지 않았다.</em></p>
<pre><code class="language-java">@Getter
@NoArgsConstructor
public class BoardResponseDto {

    private String title;
    private String username;
    private String content;
    private LocalDateTime createdAt;
    private LocalDateTime modifiedAt;


    public BoardResponseDto(Board board){
        this.title = board.getTitle();
        this.content = board.getContent();
        this.username = board.getUsername();
        this.createdAt = board.getCreatedAt();
        this.modifiedAt = board.getModifiedAt();
    }
}</code></pre>
<hr>
<h2 id="📝-등록-api--create">📝 등록 API  (Create)</h2>
<h3 id="boardcontroller">BoardController</h3>
<p><code>@PostMapping</code></p>
<p><strong>생성할 데이터에 대한 정보</strong>를 <strong>requestDto</strong>에 담아 파라미터로 전달
파라미터값을 Service의 save메소드로 싣어 보냄
결과값을 responseDto에 담아 클라이언트 쪽에 반환</p>
<pre><code class="language-java">@RequiredArgsConstructor
@RestController
public class BoardController {
    private final BoardService boardService;

    @PostMapping(&quot;/api/board&quot;)
    public BoardResponseDto createlist(@RequestBody BoardRequestDto requestDto){
        return boardService.save(requestDto);
 }</code></pre>
<h3 id="boardservice">BoardService</h3>
<p>Board <strong>객체 *<em>생성. 
save를 사용하여 *</em>BoardRepository에 객체</strong>를 저장</p>
<pre><code class="language-java">@RequiredArgsConstructor
@Service
public class BoardService {

    private final BoardRepository boardRepository;


    public BoardResponseDto save(BoardRequestDto requestDto){
        Board board= new Board(requestDto);
        boardRepository.save(board);
        return new BoardResponseDto(board);
}</code></pre>
<h2 id="📝-조회-api--read">📝 조회 API  (Read)</h2>
<p><strong>하나의 데이터만 조회하는 방법</strong></p>
<h3 id="boardcontroller-1">BoardController</h3>
<p><code>@GetMapping</code></p>
<p>조회할 데이터가 가지고 있는 <strong>id</strong>값을 받아 <strong>@pathVariable사용</strong>하여 전달
id 값을 Service의 <strong>getDetail메소드</strong>로 싣어 보냄
결과값을 <strong>responseDto</strong>에 담아 클라이언트 쪽에 반환</p>
<pre><code class="language-java">    @GetMapping(&quot;/api/board/{id}&quot;)
    public BoardResponseDto getDetail(@PathVariable Long id){
        return boardService.getDetail(id);
    }
 }</code></pre>
<h4 id="boardservice-1">BoardService</h4>
<p><strong>BoardRepository</strong>에서 <strong>해당 id값과 일치하는 데이터</strong>를 찾아 board에 저장.</p>
<blockquote>
<p>못찾을 경우: <code>에러</code> 
찾는 경우: <code>BoardResponseDto</code>에 <code>board</code> 를 담아 리턴  </p>
</blockquote>
<pre><code class="language-java"> public BoardResponseDto getDetail(Long id){
        Board board = boardRepository.findById(id).orElseThrow(
                () -&gt; new IllegalArgumentException(&quot;아이디값이 없습니다&quot;)
        );
        return new BoardResponseDto(board);
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[항해 2주차]_WIL]]></title>
            <link>https://velog.io/@acacia__u/%ED%95%AD%ED%95%B4-2%EC%A3%BC%EC%B0%A8WIL</link>
            <guid>https://velog.io/@acacia__u/%ED%95%AD%ED%95%B4-2%EC%A3%BC%EC%B0%A8WIL</guid>
            <pubDate>Sun, 02 Oct 2022 03:12:13 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/acacia__u/post/c442143c-2a8e-44c0-8531-2b4205460f4f/image.png" alt=""></p>
<h1 id="📋-이번-주-항해-과정">📋 이번 주 항해 과정!</h1>
<ol>
<li>알고리즘 챌린지 10문제 풀이 및 시험</li>
<li>주특기 Spring 시나리오 과제</li>
<li>Spring 입문 자료 학습 및 환경</li>
<li>언어 스터디 방향성 및 주특기 세션</li>
</ol>
<h1 id="👩🏫-배운-것">👩‍🏫 배운 것</h1>
<ol>
<li>Java의 다양한 클래스 사용법과 헷갈렸던 개념들
(예시, Set, Integer vs int) </li>
<li>상속을 통한 클래스 구현 방법과 접근 제어자</li>
<li>자바의 T 메모리 구조</li>
<li>Spring의 시작 방법</li>
</ol>
<h1 id="📝-이번-주-키워드">📝 이번 주 키워드</h1>
<blockquote>
<p>** 객체지향 프로그래밍이란?** object-oriented-programming (OOP)<br>
프로그래밍에서 필요한 <strong>데이터를 추상화</strong>시켜 <strong>상태</strong>와** 기능<strong>을 가진 **객체를 생성</strong>하여 그 객체간 <strong>유기적인 상호작용</strong>을 통해 로직을 구성하는 프로그래밍 방법을 일컫는다.
<br>
<strong>객체지향 프로그래밍의 장점</strong><br></p>
</blockquote>
<ol>
<li>코드 재사용성이 높다.</li>
<li>코드의 관리가 용이하다. 
( = 유지보수가 쉽다)</li>
<li>신뢰성이 높은 프로그래밍을 가능하게 한다.</li>
<li>대형 프로젝트에 적합하다.
( = 클래스 단위로 모듈화시켜서 개발할 수 있기 때문에 대형 프로젝트 처럼 여러명, 여러 회사에서 프로젝트를 개발할 때 업무 분담하기에 용이하다.)</li>
</ol>
<h1 id="한-주를-마치며💦">한 주를 마치며💦</h1>
<p>알고리즘 마라톤을 다 풀고 챌린지를 푸는데 문제가 많이 어려워졌다. 겨우 푼 문제인데 테스트 케이스를 통과하지 못하고 실패가 뜨는 사례가 생기니까 괜히 힘이 빠지는 기분이었다. 그래도 꿋꿋하게 풀려고 노력은 했는데 아직은 자바 실력이 많이 부족한 거 같아서 기본 개념을 다시 돌려보고 있다.</p>
<p>생전 스프링을 만져본 적도 없어서 입문 자료를 보며 따라해보기 시작했다.스프링 부트 프로젝트를 처음 구동해보면서, 어떤 흐름으로 작동하는건지 이해하려고 최대한 노력하고 있다. 학습 자료에 H2, JPA 등 모르는 개념들이 너무 많이나오는데 속도가 늦더라도 이 부분도 최대한 정리해가면서 공부하고 있는데 확실히 개념을 잡고 넘어가니까 빠르게 체득 하는 기분(?)이 든다.  </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] JVM T 메모리 구조]]></title>
            <link>https://velog.io/@acacia__u/Java-JVM-T-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@acacia__u/Java-JVM-T-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Fri, 30 Sep 2022 15:11:36 GMT</pubDate>
            <description><![CDATA[<h2 id="오늘-하루-">오늘 하루 ?</h2>
<p>주특기 입문 첫째날이 되었다.
난생 처음 스프링을 접해보는데, 정말 내가 이걸 &#39;할 수 있을까?&#39; 싶었던 하루였다. DI에 IoC...등 읽어도 읽어도 이해안가는 개념이 많아서 어지러운 감정이랄까... 
그래도 오전에 주특기 Spring세션으로 JVM T 메모리 구조를 배울 수 있는 시간이 있었는데, 설명이 너무 좋았고 내용이 자바를 이해하는데 꽤 도움이 되었던 것 같다. 
그래서 오늘은 이 내용을 다시 복습하는 차원에서 나만의 언어와 그림으로 정리해보려고 한다.</p>
<br>
<br>

<h2 id="투데이-토픽">투데이 토픽</h2>
<h3 id="jvm-t-메모리구조">JVM T 메모리구조</h3>
<p>👉 <code>T 메모리 구조</code></p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/5cb3555a-101a-45a4-9a27-2923cd66f3a3/image.png" alt=""></p>
<p>데이터 저장 영역을 <strong>스태틱(메소드)</strong>, <strong>스택</strong>, <strong>힙</strong> 영역으로 분리하여 T 메모리 구조라고 지칭한다.</p>
<h5 id="main-실행-전">main() 실행 전!</h5>
<p>메인 메소드가 중요한 이유 = &#39;<strong>진입점</strong>&#39;</p>
<ol>
<li>JRE는 메인 메소드를 찾는다.</li>
<li>메인 메소드의 존재를 확인한 후에만 JVM을 구동시킨다.</li>
<li>구동된 JVM은 메인 메소드를 실행하기 이전, 전처리 과정을 한다.</li>
<li>JVM은 메인 메소드를 실행한다.</li>
</ol>
<blockquote>
<p>✔ <strong>JVM 전처리 과정?</strong><br>
가장 먼저 모든 자바 프로그램이 반드시 포함하는 java.lang 패키지, import 된 패키지, 프로그램상의 모든 클래스를 스태틱(메소드) 영역에 배치하는 과정을 의미한다.</p>
</blockquote>
<h5 id="main-실행">main() 실행!</h5>
<p>메인 메소드가 실행되면 스택 프레임이 스택 영역에 할당된다. 그리고 스택 프레임 내부에는 메인 메소드에 선언된 변수에 대한 공간을 할당해준다. 가장 기본적인 메인 메소드라면, 메인 메소드의 인자 - args를 저장할 변수 공간을 스택 프레임의 가장 밑에 확보된다.</p>
<p>메인 메소드의 모든 코드가 실행이 되었다면, 스택 프레임은 소멸된다. 메인 메소드가 끝나게 되면 JRE는 JVM을 종료하고 JRE자체도 운영체제 상의 메모리에서 사라진다.</p>
<h4 id="1-스태틱-영역">1. 스태틱 영역</h4>
<p>java.lang, import된 패키지, 사용하는 클래스가 배치되는 영역이다. </p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/a10ea793-dd8a-4731-a2bb-45a6a96ecf81/image.png" alt=""></p>
<h4 id="2-스택-영역">2. 스택 영역</h4>
<p><strong>스택 프레임이 생성</strong>되는 영역이다. </p>
<p> ✔ <code>스택 프레임</code><br>
스택 프레임은 여는 중괄호로 생성되며 닫는 중괄호로 소멸된다.
<img src="https://velog.velcdn.com/images/acacia__u/post/2b71d568-198c-446a-9e2d-46d5c1543097/image.png" alt=""></p>
<h4 id="3-힙-영역">3. 힙 영역</h4>
<p><strong>객체가 배치되는 공간</strong>이다.(힙은 대용량 자료를 저장할 수 있도록 메모리를 사용하는 자료구조이다.)</p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/0b24fca3-0289-4475-a680-3ed0d7d56124/image.png" alt=""></p>
<hr>
<h3 id="코멘트">코멘트</h3>
<p>정말 어제까지만 해도 스프링의 스자도 모르던 내가 스프링을 하려니 너무 막막한 감정이 든다. 뭐부터 해야할지도 모르겠고, 일단 서블릿이나 그리들처럼 몰랐던 개념을 하나 하나 공부하고 있는데 이게 맞는 방향인지 싶은 기분도 든다. 시간은 없으니 조금 조급한 기분이 드는데, 그래도 차분한 마음을 갖자. 그리고 하나씩 단계를 밟아가며 성장하는 내가 되자.
이번주는 자바를 좀 더 완벽히 해보자. 스프링은 탄탄한 자바가 중요하다!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] int와 Integer의 차이]]></title>
            <link>https://velog.io/@acacia__u/intandInteger</link>
            <guid>https://velog.io/@acacia__u/intandInteger</guid>
            <pubDate>Tue, 27 Sep 2022 13:59:00 GMT</pubDate>
            <description><![CDATA[<p>오늘은 팀원에게 &#39;int&#39;와 &#39;Integer&#39;의 차이가 무엇이냐는 질문을 받았다. 
질문을 듣고 생각을 해보았지만, 어떤 차이가 있더라...싶으면서 머리 속이 하얗게 뒤엉키는 느낌이었다.
그동안 개념도 모른채 여기에선 int, 여기에선 Integer 이렇게 무작정 외운채 사용해왔었던 건지 정말 개념에 대해 하나도 모르겠다는 느낌을 받았다. 
그래서, 오늘은 int와 Integer의 차이를 알아보려고 한다.</p>
<p><code>int != Integer</code></p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/9a5287ca-7001-444d-b999-aa3fcdde9d6b/image.png" alt=""></p>
<h2 id="int란">int란?</h2>
<blockquote>
<p>primitive 자료형으로 변수의 타입 중 하나이다.</p>
</blockquote>
<p>** 원시형 (primitive) 변수** :  double , float , long ...등</p>
<h4 id="특징">특징</h4>
<ul>
<li>산술 연산이 가능하다.</li>
<li>null로 초기화가 되지 않는다.</li>
</ul>
<br>
<br>

<h2 id="integer">Integer</h2>
<blockquote>
<p>wrapper 클래스이다.</p>
</blockquote>
<p>Java는 <strong>기본형 타입</strong>(primitive 자료형)과 <strong>객체 참조</strong>(클래스)같은 두 가지 타입의 관리 데이터를 가지고 있다. 
경우에 따라 기본형 타입을 객체로 사용하는 경우가 있다. 
이 때, Wrapper 클래스를 사용한다.</p>
<br>

<p>** wrapper class** : 기본형을 객체로 다루기 위해 사용하는 클래스</p>
<p>아래와 같은 경우 <strong>기본형을 객체로 다루기 위해 래퍼 클래스를 사용</strong>한다.</p>
<ol>
<li>매개변수로 객체를 필요로 할 때</li>
<li>기본형 값이 아닌 객체로 저장해야 할 때</li>
<li>객체 간 비교가 필요할 때</li>
</ol>
<p>👉 Integer은 int의 <code>래퍼 클래스</code> 이다.
<img src="https://velog.velcdn.com/images/acacia__u/post/bdfb6300-dc32-4692-b9eb-0810c50de2ae/image.jpeg" alt=""></p>
<h4 id="특징-1">특징</h4>
<ul>
<li>Unboxing 하지 않을 시에 산술 연산이 불가능하다.</li>
</ul>
<p>** ✔ boxing ? **
primitive type 을 wrapper class로 변환시키는 것</p>
<p>** ✔ unboxing?**
Wrapper class를 primitive type으로 변환시키는 것</p>
<ul>
<li>null 값 처리가 가능하다.</li>
</ul>
<br>
<br>

<h2 id="int와-integer의-형변환">int와 Integer의 형변환</h2>
<p>int와 Integer은 아래의 방식으로 서로 변환이 가능하다.</p>
<pre><code class="language-java">// Integer i -&gt;  int i  (unboxing)
int i = integer.intValue();

// int i -&gt; Integer i ( boxing)
Integer integer = new Integer(i); 
</code></pre>
<h4 id="auto-boxing--unboxing">Auto boxing / unboxing</h4>
<p>자바에서는 모든 경우는 아니지만 대부분의 경우 자동으로 boxing &amp; unboxing 처리를 해준다</p>
<pre><code class="language-java">int i = 1;

//int -&gt; Integer(Auto boxing)
Integer integer = i; 

//Integer -&gt; int(Auto unboxing)
int i = integer; </code></pre>
<hr>
<p><strong>📚 Reference</strong></p>
<blockquote>
</blockquote>
<p><a href="https://hochoon-dev.tistory.com/entry/Java-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-Integer%EC%99%80-int%EC%9D%98-%EC%B0%A8%EC%9D%B4">Java 데이터 타입 Integer와 int의 차이</a> <strong>( tistory | hochoon )</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] HashSet의 개념과 사용법 정리]]></title>
            <link>https://velog.io/@acacia__u/hashSet</link>
            <guid>https://velog.io/@acacia__u/hashSet</guid>
            <pubDate>Mon, 26 Sep 2022 10:07:23 GMT</pubDate>
            <description><![CDATA[<h2 id="set-이란">Set 이란?</h2>
<h3 id="set-인터페이스-구현-클래스">Set 인터페이스 구현 클래스</h3>
<ol>
<li><p>객체를 중복해서 저장할 수 없으며, 하나의 null 값만 저장할 수 있다.</p>
</li>
<li><p>중복을 자동으로 제거해준다.</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/82ed28a7-7e96-4c56-ab1b-f868c09cd520/image.png" alt=""></p>
<p>&lt;출처 : <a href="%5Bhttps://blog.kakaocdn.net/dn/p0lsV/btqEoTQmrxr/GJTITDi91geD1uN9EhbXl0/img.png">자바 HashSet 사용법 &amp; 예제 총정리</a> &gt;</p>
<p>Set은 비선형 구조이기 때문에 &#39;순서&#39;의 개념과 &#39;인덱스&#39;가 존재하지 않는다. 
때문에 값을 추가 / 삭제 하는 경우 Set 내부에 해당 값을 검색하여 해당 기능을 수행해야 한다. 이로 인해 처리 속도가 List구조에 느리다는 것이 단점이다.</p>
<h2 id="hashset이란">HashSet이란?</h2>
<p>HashSet은 <code>Set 인터페이스</code>에서 지원하는 구현 클래스이다. 때문에 <code>Set</code>의 성질을 그대로 상속받는 다는 것이 특징이다.</p>
<h3 id="hashset의-성질">HashSet의 성질</h3>
<ol>
<li>HashSet은 중복된 값을 허용하지 않습니다.<pre><code>값의 존재 유무를 파악할 때 사용할 수 있다.</code></pre></li>
<li>List 등과는 다르게 저장한 순서가 보장되지 않습니다.<pre><code>저장 순서를 유지해야 한다면 JDK 1.4부터 제공되는 클래스 
LinkedHashSet을 사용해야 한다.</code></pre></li>
<li>null을 값으로 허용합니다.</li>
</ol>
<h3 id="hashset의-구현">HashSet의 구현</h3>
<p>HashSet 내부 코드를 보면 <code>HashMap</code>을 사용하여 구현되어 있는 것을 볼 수 있다.</p>
<h4 id="1-hashset-생성">1. HashSet 생성</h4>
<p> 아래 코드와 같이 사용하여 다양한 방법으로 Hash를 생성할 수 있다.</p>
<pre><code class="language-java">// 타입을 지정 가능
HashSet&lt;String&gt; animals1 = new HashSet&lt;String&gt;();

// 타입을 생략하여 사용 가능 -&gt; 빈 HashSet생성 시 사용
HashSet&lt;String&gt; animals2 = new HashSet&lt;&gt;();  

// 초기 용량(Capacity) 설정
HashSet&lt;String&gt; animals3 = new HashSet&lt;&gt;(10); 

 // animal의 모든 값을 가진 HashSet 생성 
HashSet&lt;String&gt; animals4 = new HashSet&lt;&gt;(animals1);

//초기값 지정 가능
HashSet&lt;String&gt; animals5 = new HashSet&lt;&gt;(Arrays.asList(&quot;tiger&quot;, &quot;lion&quot;, &quot;fox&quot;)); 
</code></pre>
<br>
<br>

<h4 id="2-hashset-요소-값-추가">2. HashSet 요소 값 추가</h4>
<p>생성된  Hash에 <code>add()</code> 메소드를 호출하여 값을 추가 가능하다.</p>
<pre><code class="language-java">
HashSet&lt;String&gt; animals = new HashSet&lt;&gt;()
    animals.add(&quot;tiger&quot;);
    animals.add(&quot;lion&quot;);
    animals.add(&quot;fox&quot;);

HashSet은 저장 순서가 보장되지 않기에 특정 위치에 값을 추가하거나 할 수는 없다는 것을 명심 !</code></pre>
<p>만약 입력되는 값이  </p>
<ul>
<li>HashSet 내부에 존재하지 않는다면 그 값을 HashSet에 추가하고 true 를 반환한다.</li>
<li>HashSet 내부에 존재한다면 false를 반환한다.</li>
</ul>
<br>
<br>

<h4 id="3-hashset-크기-구하기">3. HashSet 크기 구하기</h4>
<p><code>size()</code>  메소드를 사용하여 Hash의 크기를 구할 수 있다.</p>
<pre><code class="language-java">HashSet&lt;Integer&gt; set = new HashSet&lt;Integer&gt;(Arrays.asList(1,2,3));

//set 크기 : 3
System.out.println(set.size());</code></pre>
<br>
<br>

<h4 id="4-hashset-요소-값-삭제">4. HashSet 요소 값 삭제</h4>
<p><code>remove(value)</code> 와 <code>clear()</code> 메소드를 사용하여 Hash값을 제거할 수 있다.</p>
<pre><code class="language-java">HashSet&lt;Integer&gt; set = new HashSet&lt;Integer&gt;(Arrays.asList(1,2,3));

//값 1 제거
set.remove(2);

//모든 값을 제거
set.clear();</code></pre>
<p>만약 삭제하려는 값이</p>
<ul>
<li>HashSet 내부에 존재한다면 그 값을 삭제하고 true를 반환한다.</li>
<li>HashSet 내부에 존재하지 않는 다면,  false를 반환한다.</li>
</ul>
<br>
<br>

<h4 id="5-hashset-요소-값-검색">5. HashSet 요소 값 검색</h4>
<p>원하는 값에 대해 <code>contains(value)</code> 메소드를 통해 Hash 내부에 존재하는 지 확인이 가능하다.</p>
<pre><code class="language-java">HashSet&lt;Integer&gt; set = new HashSet&lt;Integer&gt;(Arrays.asList(1,2,3));

////set내부에 값 1이 있다면 true 출력, 없다면 false 출력
System.out.println(set.contains(1)); </code></pre>
<br>
<br>

<h4 id="6-hashset-요소-값-출력">6. HashSet 요소 값 출력</h4>
<p>Set 컬렉션을 그냥 &#39;print&#39; 처리 할 경우 대괄호( &#39;[ ]&#39; )로 묶여 Set의 전체값이 출력된다. 
때문에, 전체 객체를 대상으로 한번씩 반복해서 가져오는 <code>반복자 (Iterator)</code>를 사용해 출력해야 한다.</p>
<pre><code class="language-java">HashSet&lt;Integer&gt; set = new HashSet&lt;Integer&gt;(Arrays.asList(1,2,3));

//출력결과 :  [1,2,3]
System.out.println(set); 


Iterator iter = set.iterator();    

//hasNext() : 가져올 객체가 있다면 true 리턴, 없다면 false 리턴
// next() : Iterator에서 하나의 객체를 가져올 수 있는 메소드
while(iter.hasNext()) {
    System.out.println(iter.next());
}</code></pre>
<hr>
<p>📚 Reference</p>
<blockquote>
<p><a href="https://crazykim2.tistory.com/474"> HashSet이란?</a> <strong>(tistory | crazykim2)
**
<a href="https://psychoria.tistory.com/780">자바 HashSet 사용 방법</a></strong>       (tistory | psychoria ) **</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[항해 1주차]_WIL]]></title>
            <link>https://velog.io/@acacia__u/WIL1</link>
            <guid>https://velog.io/@acacia__u/WIL1</guid>
            <pubDate>Sun, 25 Sep 2022 08:54:38 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/acacia__u/post/e241ca48-f450-4f8b-bf22-d38092e19dad/image.png" alt=""></p>
<h1 style="color:green">📋 이번 주 항해 과정!</h1>

<ol>
<li>웹 개발 플러스 강의 시청</li>
<li>미니 프로젝트 기획, 구현, 발표</li>
<li>알고리즘 문제 풀이 28문제</li>
</ol>
 <h1 style="color:green">👩‍🏫 배운 것</h1>

<ol>
<li>로그인 페이지와 로그아웃의 구현 방식</li>
<li>웹페이지에서의 CRUD 구현 방식</li>
</ol>
<h1 style="color:green"> 📝 이번 주 키워드 </h1>

<blockquote>
<p><strong>JWT 란?</strong>
JWT는 JSON Web Token의 약자로 유저를 인증하고 식별하기 위한 토큰기반 인증이다. 토큰은 세션과 달리 서버가 아닌 클라이언트에 저장되기 때문에 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 덜 수 있다. <br>
자세한 내용은 <a href="https://velog.io/@acacia__u/JSONJWT%EB%A5%BC-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC%ED%95%B4%EB%B3%B4%EC%9E%90">[JSON]_JWT를 이해하기 쉽게 정리해보자</a>에 정리해 놓았다.<br>
**  API 란?**
Application Programming Interface (응용 프로그램 프로그래밍 인터페이스)
API 는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. -위키백과-
<br>
API는 애플리케이션을 서로 연결하여 서로 통신할 수 있다는 것는 매개체이다!</p>
</blockquote>
<h1 style="color:green">한 주를 마치며💦</h1>

<p>하루 하루 느낀게 많은 한 주였다. 태어나서 이렇게 오랜 시간 책상 앞에 앉아 어떤 것을 해본 게 처음이었다.
처음엔 주 100시간이 정말 넘을 수 없는 벽같이 느껴지기만 했는데, 달려오다보니 어느새 내가 그 벽을 넘고있는 모습을 보니 감회가 새로웠다.</p>
<p>미니 프로젝트를 구현하는 과정에서도 온전히 다른 사람들과 호흡 맞춰가며 했다는 점에서도 정말 좋은 경험을 했다고 느꼈다. 당황스럽고 어려운 점도 많이 생겼는데, 조원들에게 묻고 같이 해결해나가는 과정을 거치면서 함께 성장하는 기분도 받았던 것 같다.</p>
<p>알고리즘 문제 풀이 부분에서는 문제를 풀다보니 자바의 모르는 개념이나 함수들이 너무 많았다. 대표적으로 리스트가 어떤 식으로 사용해야하는지 어떤 부분에서 유용한지 몰랐는데 계속 문제를 풀어가면서 적용해보니 조금씩 감이 잡히기 시작했다. 마라톤 문제 끝까지 생각보다 빨리 풀 수 있어서 좋았고, 다음 주엔 챌린지 문제에 도전해 볼 생각이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[algorithm/Java]_정수 제곱근 판별하기]]></title>
            <link>https://velog.io/@acacia__u/algorithmJava%EC%A0%95%EC%88%98-%EC%A0%9C%EA%B3%B1%EA%B7%BC-%ED%8C%90%EB%B3%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@acacia__u/algorithmJava%EC%A0%95%EC%88%98-%EC%A0%9C%EA%B3%B1%EA%B7%BC-%ED%8C%90%EB%B3%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 24 Sep 2022 13:58:23 GMT</pubDate>
            <description><![CDATA[<h2 id="오늘-하루-">오늘 하루 ?</h2>
<p>알고리즘 문제 풀이 둘째 날이다. 
<a href="https://school.programmers.co.kr/learn/courses/30/lessons/12934">프로그래머스</a> 로 문제를 푸는데, 몇 문제가 꽤나 어렵게 풀리는 느낌이 들었다. 쉽고 간결한 코드를 작성하고 싶은데 그게 안되고, 내 코드는 저~ 멀리 돌아가는 느낌이랄까? 아무튼 그 중에서 정수 제곱근 판별 문제에 아주 골머리를 앓았다.
처음엔 반복문과 조건문을 사용해 접근하는 방식으로 풀었는데, 테스트 2번과 4번을 시간 초과로 통과하지 못했다. 
질문하기 창에서 검색도 해보고, 몇 시간 동안 이리 저리 코드도 뜯어봤지만 모르겠더라...
결국엔 구글링해서 <code>Math.sqrt()</code>를 사용하는 방법으로 풀었는데, 처음 보는 용어인지라 한번 짚고 넘어가는 차원에서 오늘의 트러블 이슈는 이것으로 정했다.!</p>
<h3 style="color:green">트러블 이슈</h3>

<p>🖊 문제 설명</p>
<blockquote>
<p>임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.</p>
</blockquote>
<p>✔ <code>Math.sqrt()</code> ?</p>
<p><strong>java.lang.Math</strong> 클래스의 메소드로 특정값의 <strong>제곱근(루트)</strong>를 구할 때 사용한다.</p>
<pre><code class="language-java">Math.sqrt(n)    --&gt;  결과값 : √n</code></pre>
<hr>
<h3 id="코멘트">코멘트</h3>
<p>목표치였던 &#39;마라톤&#39; 완주를 4문제 남겨뒀다. 최대한 푼다고 풀었는데 오늘 다 하지 못한게 조금 아쉬운 하루였다.
문제 풀이도 조금 간결하고 예쁜 코드를 짜고 싶은데 맘처럼 안되는게 속이 상하지만 그래도 계속 연습하고 풀다보면 언젠간 자바의 &#39;신&#39;이 되어있지 않을까.! 
절대 지치지 말기로 하자.</p>
<hr>
<p>📚 Reference</p>
<blockquote>
<p><a href="https://coding-factory.tistory.com/532">https://coding-factory.tistory.com/532</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 문제 풀이 시작!_[9기]]]></title>
            <link>https://velog.io/@acacia__u/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-%EC%8B%9C%EC%9E%919%EA%B8%B0</link>
            <guid>https://velog.io/@acacia__u/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-%EC%8B%9C%EC%9E%919%EA%B8%B0</guid>
            <pubDate>Fri, 23 Sep 2022 14:20:14 GMT</pubDate>
            <description><![CDATA[<h2 id="오늘-하루-">오늘 하루 ?</h2>
<p>오늘은 프로그래밍 기초 주차가 시작된 날이다. Java 기초 문법에 대해 몇가지 찾아보면서 알고리즘 문제를 풀었다. 그 중에 Java 행렬의 개념이 조금 이해하기 어려워 문제를 푸는데 어려움이 있었다.</p>
<h3 style="color:green"> 트러블 이슈 </h3>

<p>🖊 문제 설명 </p>
<blockquote>
<p>행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.</p>
</blockquote>
<p>처음에 Java에서의 행렬 자체의 개념과 행, 열에 각각 접근하는 방식을 쉽게 이해하지 못했다. 
하지만 <code>다차원 배열</code>의 개념으로 접근해 이해하니 쉽게 이해할 수, 각 행과 열에 접근하는 방식 또한 구글링하여 문제를 풀 수 있었다.</p>
<p>✔ <code>다차원 배열</code> 이란?
2차원 이상의 배열을 의미하며, <strong>배열의 요소</strong>로 또 <strong>다른 배열</strong>을 가지는 배열을 의미한다.</p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/170a0863-0306-415a-b44d-440a3314f3e2/image.png" alt="">
<a href="http://www.tcpschool.com/java/java_array_twoDimensional">출처 : tcpschool</a>
<br></p>
<p><strong>1) 문법</strong></p>
<pre><code class="language-java">1. int[][] arr;
2. int arr[][];
3. int[] arr[];</code></pre>
<p><strong>2) 행과 열의 길이</strong></p>
<pre><code class="language-java">int arr.length =&gt; &#39;행&#39;의 길이
int arr[0].length =&gt; &#39;열&#39;의 길이(첫번째 행)</code></pre>
<p>그래서 완성된 코드 !!!</p>
<pre><code class="language-java">int[][] answer = new int[arr1.length][arr1[0].length];

for (int i = 0; i &lt; arr1.length; i++) {
    for (int j = 0; j &lt; arr1[0].length; j++) {

           answer[i][j] = arr1[i][j] +arr2[i][j]; 
    }
}    </code></pre>
<hr>
<h3 style="color:green"> 코멘트</h3>
미니 프로젝트 동안 긴장감을 계속 갖고있던 터라, 오늘은 뭔가 자꾸 힘이 빠지는 기분이었다. 주특기 주 시작 전에 자바를 완벽히는 아니더라도 조금은 "나! 잘해요!" 싶게 잡아두고 가고 싶은데... 
내일은 '마라톤'을 끝내보자!

<hr>
<p>📚 Reference</p>
<blockquote>
<p><a href="http://www.tcpschool.com/java/java_array_twoDimensional">tcpschool</a> <strong>(tcpschool)</strong></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Hash]_해시함수란 무엇인가!]]></title>
            <link>https://velog.io/@acacia__u/%ED%95%B4%EC%8B%9C%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@acacia__u/%ED%95%B4%EC%8B%9C%ED%95%A8%EC%88%98</guid>
            <pubDate>Tue, 20 Sep 2022 01:39:36 GMT</pubDate>
            <description><![CDATA[<h1 id="해시함수의-개념">해시함수의 개념</h1>
<h3 id="해시함수란">해시함수란?</h3>
<blockquote>
<p>알고리즘의 한 종류로서 임의의 길이를 갖는 데이터를 입력 받아서 항상 고정된 길이의 해시값으로 변환하여 출력해주는 함수를 말한다.
-Wikipedia</p>
</blockquote>
<h3 id="해시함수의-특징">해시함수의 특징</h3>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/12ce1465-e2cf-4c34-8d96-fe62bb8ee747/image.png" alt=""></p>
<p><strong>1. 어떤 입력 값에도 항상 고정된 길이의 해시값을 출력한다.</strong></p>
<ul>
<li>회원가입에 사용할 해시함수 SHA256은 어떤 길이의 입력값을 넣어도 항상 256바이트의 결과값이 나온다!</li>
</ul>
<p><strong>2. 눈사태 효과: 입력 값이 일부만 변경되어도 전혀 다른 값을 출력한다.</strong></p>
<p><strong>3. 출력된 결과 값을 통해서 입력값을 알아내기에 불가능하다.</strong></p>
<ul>
<li>어떠한 규칙성도 발견할 수 없다.</li>
</ul>
<h3 id="해시함수의-예시">해시함수의 예시</h3>
<p>아래 예시는 SHA1를 통해 비슷한 문자열을 암호화한 결과값이다.</p>
<pre><code>&quot;주영재&quot; -&gt; DDB0ED48A84B6C328E50B3BFB3D15364C669C3A6
&quot;주영째&quot; -&gt; 1C2FC56A4172A9B6D5C3C20309A46C01896D3194
&quot;주형재&quot; -&gt; 1DA926EEF1EF8533F57A45124871F8550A278EA9</code></pre><h3 id="해시함수의-활용">해시함수의 활용</h3>
<p>해시함수는 그리 복잡하지 않은 알고리즘으로 구현되기 때문에, 상대적으로 CPU , 메모리 같은 시스템 자원을 덜 소모한다. 
뿐만 아니라, 다양한 목적에 맞게 설계된 해시 함수가 존재하기 때문에 다양한 분야에서 활용하기 유용하다.</p>
<hr>
<p><strong>📚 Reference</strong></p>
<blockquote>
</blockquote>
<p><a href="https://ko.wikipedia.org/wiki/%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98">위키백과 해시함수</a> <strong>(위키백과)</strong>
<a href="https://velog.io/@zuyonze/%ED%95%B4%EC%8B%9C%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0">해시함수에 대한 개념 정리하기</a> <strong>( velog | Bityoungjae )</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JSON]_JWT를 이해하기 쉽게 정리해보자. ]]></title>
            <link>https://velog.io/@acacia__u/JSONJWT%EB%A5%BC-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC%ED%95%B4%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@acacia__u/JSONJWT%EB%A5%BC-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC%ED%95%B4%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Tue, 20 Sep 2022 00:04:42 GMT</pubDate>
            <description><![CDATA[<h2 id="1-jwt란">1. JWT란?</h2>
<p>JWT(JSON Web Token)은 <strong>인증에 필요한 정보들을 암호화시킨 JSON 토큰</strong>을 의미한다.
<strong>토큰</strong>(Access Token) 은 세션과는 달리 서버가 아닌 <strong>클라이언트에 저장</strong>되기 때문에, 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 덜 수 있다는 장점이 있다.</p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/e919d260-1a4a-4b06-95a7-57a2554cd1e6/image.png" alt=""></p>
<p>JWT는 토큰 자체에 사용자의 권한 정보 혹은 서비스를 사용하기 위한 정보를 포함시키기 때문에, 데이터가 많아지면 토큰이 커진다는 특성이 있다.</p>
<p>또한 토큰이 한번 발급되었다면, 사용자의 정보를 바꾸더라도 토큰을 재발급하지 않는 이상 반영되지 않는다.</p>
<h4 id="그렇다면-jwt-기반-인증이란">그렇다면, JWT 기반 인증이란?</h4>
<p>즉, JWT 토큰을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방법이다.</p>
<h2 id="2-jwt의-구조">2. JWT의 구조</h2>
<p>JWT는 <code>.</code>을 구분자로 <code>Header</code>,  <code>Payload</code>,  <code>Signature</code> 로 구성된다.</p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/45071767-28f8-430c-a2a0-5fda08208fa8/image.png" alt=""></p>
<h3 id="header">Header</h3>
<p>JWT에서 사용할 타입과 해시 알고리즘의 종류가 담겨있다</p>
<h3 id="payload">Payload</h3>
<p>서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있다.</p>
<h3 id="signature">Signature</h3>
<p> Header, Payload 를 Base64 URL-safe Encode 를 한 이후 Header 에 명시된 해시함수를 적용하고, 개인키(Private Key)로 서명한 전자서명이 담겨있다.</p>
<p> 전자서명에는 비대칭 암호화 알고리즘을 사용하므로 암호화를 위한 키와 복호화를 위한 키가 다르다. 암호화(전자서명)에는 개인키를, 복호화(검증)에는 공개키를 사용한다.</p>
<h2 id="3-jwt를-이용한-인증-과정">3. JWT를 이용한 인증 과정</h2>
<blockquote>
<ol>
<li>사용자가 ID, PW를 입력하여 서버에 로그인 인증을 요청한다.<br></li>
<li>서버가 클라이언트로부터 인증 요청을 받으면 Header, Payload, Signature를 정의한다.
(Hedaer, PayLoad, Signature를 각각 Base64로 한 번 더 암호화하여 JWT를 생성하고 이를 쿠키에 담아 클라이언트에게 발급한다.)<br></li>
<li>클라이언트는 서버로부터 받은 JWT를 로컬 스토리지에 저장한다. (쿠키나 다른 곳에 저장할 수도 있다.)
(API를 서버에 요청할때** Authorization header에 Access Token을 담아서 보낸다**.)<br></li>
<li>서버가 할 일은 클라이언트가 Header에 담아서 보낸 JWT가 내 서버에서 발행한 토큰인지 일치 여부를 확인하여 일치한다면 인증을 통과시켜주고 아니라면 통과시키지 않으면 된다.
(인증이 통과되었으므로 페이로드에 들어있는 유저의 정보들을 select해서 클라이언트에 돌려준다.)<br></li>
<li>클라이언트가 서버에 요청을 했는데, 만일 액세스 토큰의 시간이 만료되면 클라이언트는 리프래시 토큰을 이용해서 서버로부터 새로운 엑세스 토큰을 발급 받는다.</li>
</ol>
</blockquote>
<h2 id="4-cookie--session--jwt">4. Cookie &amp; Session / JWT</h2>
<h3 id="cookie--session"><strong>Cookie &amp; Session</strong></h3>
<p>*<em>장점 *</em>  </p>
<ol>
<li>Cookie만 사용하는 방식보다 보안이 향상된다.</li>
<li>서버 쪽에서 Session 통제 가능하다.</li>
<li>네트워크 부하 가능성이 낮다.</li>
</ol>
<p>*<em>단점
*</em></p>
<ol>
<li>세션 저장소 사용으로 서버가 부하된다.</li>
</ol>
<br>

<h3 id="jwt"><strong>JWT</strong></h3>
<p><strong>장점</strong></p>
<ol>
<li>인증을 위한 별도의 저장소가 필요가 없다.</li>
<li>별도의 I/O 작업이 없는 빠른 인증 처리가 가능하다.</li>
<li>확장성이 우수하다.</li>
<li>Header와 Payload를 가지고 Signature를 생성하기 때문에 데이터의 위변조를 막을 수 있다.</li>
<li>토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능하다.</li>
<li>모바일 어플리케이션 환경에서도 잘 작동한다.</li>
</ol>
<p><strong>단점</strong></p>
<ol>
<li>토큰의 길이가 늘어날수록 네트워크가 부하된다.</li>
<li>특정 토큰을 강제로 만료시키기가 어렵다.</li>
</ol>
<hr>
<p><strong>📚 Reference</strong></p>
<blockquote>
<p><a href="https://pronist.dev/143">JWT의 개념부터 구현까지 알아보기</a>
<a href="http://www.opennaru.com/opennaru-blog/jwt-json-web-token/">JWT이해와 활용</a>
<a href="https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC">JWT 토큰 인증 이란?</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Web]_동적페이지를 정의해보자!]]></title>
            <link>https://velog.io/@acacia__u/%EB%8F%99%EC%A0%81%ED%8E%98%EC%9D%B4%EC%A7%80</link>
            <guid>https://velog.io/@acacia__u/%EB%8F%99%EC%A0%81%ED%8E%98%EC%9D%B4%EC%A7%80</guid>
            <pubDate>Mon, 19 Sep 2022 04:50:14 GMT</pubDate>
            <description><![CDATA[<h1 style="color : green">  정적페이지와 동적페이지</h3>

<p><img src="https://velog.velcdn.com/images/acacia__u/post/b5706e68-9404-46b0-9943-7e84663cb643/image.png" alt=""></p>
<p>&lt; 출처 <a href="https://miro.medium.com/max/1400/1*V2sbpI7kx8KcHkFokEqRRQ.png">동적페이지와 정적페이지</a> &gt;</p>
<h3 id="1-정적-페이지">1. 정적 페이지</h3>
<blockquote>
<p><strong>정적 웹페이지</strong>(static web page)란 서버에 저장되어있는 HTML+CSS 파일을 <strong>그대로</strong> 보여주는 것을 말한다.</p>
</blockquote>
<p> 즉, 모든 사용자에게 똑같은 페이지를 제공하는 것이다.</p>
<p>통신과 계산이 필요없기에 속도가 빠르며, 서버 부담이 적다는 것이 특징이지만, 수정/삭제/추가 등 내용 변경에 있어서 HTML자체를 수정해야하는 번거로움이 존재한다. </p>
<h3 id="2-동적페이지">2. 동적페이지</h3>
<blockquote>
<p><strong>동적 웹페이지</strong>(dynamic web page)는 <strong>상황</strong>에 따라 서버에 저장되어있는 HTML에 <strong>데이터</strong>를 추가하고 <strong>가공</strong>하여 <strong>반환</strong>해 보여주는 방법이다.</p>
</blockquote>
<p>즉 사용자 마다 다른 페이지를 제공한다.
요즘 대부분의 사이트는 동적페이지로 구성되어있다. </p>
<p>페이지를 상황/시간/사용자의 요청에 따라 다른 모습을 보여줄 수 있다.
하지만 이러한 점 때문에 검색 엔진 최적화가 어렵고, 사용자가 입력을 할 수 있다는 공간이 있어 보안이 취약하다는 단점이 있다.</p>
<h1 style="color : green">  동적 웹 페이지의 종류</h1>

<h3 id="1csr">1.CSR</h3>
<p><code>Client-side-rendering</code></p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/ca9f0474-bcc0-43f3-b0c2-c516a2b284cc/image.png" alt="">
&lt; 출처 <a href="https://medium.com/walmartglobaltech/the-benefits-of-server-side-rendering-over-client-side-rendering-5d07ff2cefe8">The Benefits of Server Side Rendering Over Client Side Rendering</a> &gt;</p>
<p>자바스크립트에 데이터를 포함해 태워보낸 후, *<em>클라이언트 *</em>쪽에서 HTML을 완성하는 방법</p>
<p>복잡해지고 있는 웹페이지를 구현하는데 기존 방식(SSR)보다 많이 사용되고 있다.</p>
<blockquote>
</blockquote>
<p>동작하는 과정 :
HTML 다운로드 - JS 다운로드 - JS 실행 - DATA 서버로부터 받기 - Content 확인가능</p>
<p>*<em>장점 *</em></p>
<p>1) 사용자의 행동에 따라 필요한 부분만 다시 읽어들이기 때문에 빠른 interaction이 가능하다.
2) 전체가 아닌 필요한 페이지 필요한 부분만 변경하기 때문에 모바일 네트워크에서도 빠른 속도로 랜더링이 가능하다.
3) 일관성 있는 코드 작성이 가능하다.
4) lazy loading을 지원한다.
❓lazy loading이란 ? 페이지 로딩 시 중요하지 않은 리소스의 로딩을 늦추는 기술
 (Ex. 스크롤 내려야만 해당 이미지 보이게 하는 것)</p>
<p><strong>단점</strong></p>
<p>1) Searchconsle, Googlebot에 검색 노출이 되지않는다.
(브라우저가 없기때문에, html만 가져와서 생기는 문제)
2) 페이지와 자바스크립트를 읽은 후 화면에 보여주는 것까지 마쳐야 콘텐츠가 사용자에게 비춰지기 때문에 초기구동 속도가 느리다.
3) 쿠키 말고는 사용자의 정보를 담을 수 없다.</p>
<h3 id="2ssr">2.SSR</h3>
<p><code>Server-side-rendering</code>
<img src="https://velog.velcdn.com/images/acacia__u/post/41f9d148-13e8-42d3-827c-6c664b350991/image.png" alt=""></p>
<p>&lt; 출처 <a href="https://medium.com/walmartglobaltech/the-benefits-of-server-side-rendering-over-client-side-rendering-5d07ff2cefe8">The Benefits of Server Side Rendering Over Client Side Rendering</a> &gt;
<strong>서버</strong>쪽에서 템플릿 HTML에 데이터를 끼워넣어 완성된 형태의 HTML을 보내주는 방법</p>
<p>전통적입 웹 어플리케이션 렌더링 방식이다.</p>
<h4 id="장점">장점</h4>
<p>1) 사용자가 컨텐츠를 볼 수 있는 시점을 앞당길 수 있다.
2) 검색엔진 최적화에 용이하다.</p>
<h4 id="단점">단점</h4>
<p>1) 모든 요청에 대해 필요 부분에 대해서가 아닌 완전 새페이지를 로딩해 렌더해준다. (즉, 새로고침)
2) 전체를 로딩하다 보니 CSR보다 느리고, bandwitdh를 많이 쓰고, 사용자 경험 좋지 않다.
(화면에는 html요소들이 모두 나오나 js파일 모두가 다운로드 되지않아서 버튼이 클릭되지않는 등의 현상이 있을 수 있다.)</p>
<h3 id="3복합적인-방법">3.복합적인 방법</h3>
<p>클라이언트 쪽에서 <strong>Ajax</strong> 요청을 보내서 서버에서 데이터를 받아와 HTML을 완성하는 방법</p>
<hr>
<p><strong>📚 Reference</strong></p>
<blockquote>
<p><a href="https://medium.com/walmartglobaltech/the-benefits-of-server-side-rendering-over-client-side-rendering-5d07ff2cefe8">The Benefits of Server Side Rendering Over Client Side Rendering</a> <strong>(Blog | Alex Grigoryan)</strong></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA['Markdown' 사용법 총정리! ]]></title>
            <link>https://velog.io/@acacia__u/Markdown%EC%82%AC%EC%9A%A9%EB%B2%95%EC%B4%9D%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@acacia__u/Markdown%EC%82%AC%EC%9A%A9%EB%B2%95%EC%B4%9D%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 15 Sep 2022 06:20:01 GMT</pubDate>
            <description><![CDATA[<p>얼마전부터 velog를 쓰고있다. 무작정 처음에는 내가 보기에 예쁘게 정리해 글을 썼다가 다른 사람들의 글들을 보니이게 또 형식이라는게...있다는 것을 알게되었다.그래서 정리해보는 &#39;Markdown&#39; 사용법 되겠다.</p>
<h1 id="마크다운이란">마크다운이란?</h1>
<blockquote>
<p>Markdown은 일반 텍스트문서의 양식을 편집하는 문법이다. 현재 세계에서 가장 있기 있는 마크업 언어 중 하나로 Markdown 형식의 파일을 만들 때 텍스트에 Maekdown 구문을 추가하여 다르게 보일 단어와 구문을 표현할 수 있다.</p>
</blockquote>
<p>** 마크다운 가이드**
<a href="https://www.markdownguide.org/">https://www.markdownguide.org/</a></p>
<h1 id="마크다운을-작성하는-방법🖊">마크다운을 작성하는 방법🖊</h1>
<h2 id="1-headings">1. Headings</h2>
<p><code>h1</code> 부터 <code>h6</code>까지 표현 가능하며, <code>#</code> 을 앞에 작성합니다.</p>
<p>✍ 작성법</p>
<pre><code># h1
## h2
### h3
#### h4</code></pre><p>💻 결과</p>
<h1 id="h1">h1</h1>
<h2 id="h2">h2</h2>
<h3 id="h3">h3</h3>
<h4 id="h4">h4</h4>
<hr>
<h2 id="2-문단-간격">2. 문단 간격</h2>
<p>문단의 간격은 <code>줄 바꿈</code>으로 나타내며, 여러 번 줄 바꿈 시 <code>&lt;br/&gt;</code>을 사용하면 가능합니다</p>
<p>✍ 작성법</p>
<pre><code>This is the first line.&lt;br/&gt;&lt;br/&gt;
This is the second line.</code></pre><p>💻 결과</p>
<p>This is the first line.<br/><br/>
This is the second line.</p>
<hr>
<h2 id="3인용">3.인용</h2>
<p>인용문은 <code>&gt;</code> 을 통해 작성합니다.</p>
<p>✍ 작성법</p>
<pre><code>&gt; 인용문 작성법    


&gt; 인용문 작성법
&gt;&gt; `&gt;`을 사용하여 작성
&gt;&gt;&gt; 중첩이 가능</code></pre><p>💻 결과</p>
<blockquote>
<p>인용문 작성법    </p>
</blockquote>
<blockquote>
<p>인용문 작성법</p>
<blockquote>
<p><code>&gt;</code>을 사용하여 작성</p>
<blockquote>
<p>중첩이 가능</p>
</blockquote>
</blockquote>
</blockquote>
<hr>
<h2 id="4-목록">4. 목록</h2>
<p>순서를 표기하는 목록/ 순서를 표기하지 않는 목록 두가지를 작성할 수 있습니다.</p>
<h3 id="1-순서를-표기하는-목록">1) 순서를 표기하는 목록</h3>
<p><code>숫자</code> 와 <code>.</code> 을 이용해 작성합니다.</p>
<p>✍ 작성법</p>
<pre><code>1. 첫 번째 작성법
2. 두 번째 작성법
3. 세 번째 작성법</code></pre><p>💻 결과</p>
<ol>
<li>첫 번째 작성법</li>
<li>두 번째 작성법</li>
<li>세 번째 작성법<h3 id="2-순서를-표기하지-않는-목록">2) 순서를 표기하지 않는 목록</h3>
<code>-</code>,<code>*</code>,<code>+</code>을 사용하여 작성합니다. (작성 결과는 같습니다.)  </li>
</ol>
<p>✍ 작성법</p>
<pre><code>- 순서 없는 목록 1
    - 목록 1.1
        - 목록 1.2
- 순서 없는 목록 2

        Tab 두번 하면 코드 블럭을 만들 수 있어요.

* 순서 없는 목록 3
+ 순서 없는 목록 4　</code></pre><p>💻 결과</p>
<ul>
<li><p>순서 없는 목록 1</p>
<ul>
<li>목록 1.1<ul>
<li>목록 1.2</li>
</ul>
</li>
</ul>
</li>
<li><p>순서 없는 목록 2</p>
<pre><code>  Tab 두번 하면 코드 블럭을 만들 수 있어요.</code></pre></li>
<li><p>순서 없는 목록 3</p>
</li>
<li><p>순서 없는 목록 4　</p>
</li>
</ul>
<hr>
<h2 id="5-폰트-스타일">5. 폰트 스타일</h2>
<p>기본적인 스타일을 작성 가능합니다.</p>
<p>✍ 작성법</p>
<pre><code>__굵게__
**굵게**
_기울여 쓰기_
*기울여 쓰기*
~~취소선~~</code></pre><p>💻 결과
<strong>굵게</strong>
<strong>굵게</strong>
<em>기울여 쓰기</em>
<em>기울여 쓰기</em>
<del>취소선</del></p>
<hr>
<h2 id="6-코드블럭">6. 코드블럭</h2>
<p><code>백틱(&#39;)</code>을 사용하여 작성가능합니다. 여러줄의 코드블럭은 백틱을 <code>세개</code> 사용하여 작성합니다.</p>
<p>✍ 작성법</p>
<pre><code>`인라인 코드 작성법`</code></pre><pre><code>```
여러줄 코드블럭 작성법
```</code></pre><p>💻 결과</p>
<p><code>인라인 코드 작성법</code></p>
<pre><code>여러줄 코드블럭 작성법</code></pre><p><strong>❗코드 하이라이트 기능</strong>
백틱 3개뒤에 <code>언어명</code>과 <code>코드</code>를 입력합니다.</p>
<p>✍ 작성법</p>
<pre><code>```python
print(&quot;hello world&quot;)
```</code></pre><p>💻 결과</p>
<pre><code class="language-python">print(&quot;hello world&quot;)</code></pre>
<hr>
<h2 id="7-수평선">7. 수평선</h2>
<p><code>*</code> , <code>-</code>, <code>_</code> 등 3개 이상 입력하여 작성합니다.(띄어쓰기를 중간에 삽입해도 됩니다.)</p>
<p>✍ 작성법</p>
<pre><code>***
-----
_______
__ __ __ </code></pre><p>💻 결과</p>
<hr>
<hr>
<hr>
<hr>
<hr>
<h2 id="8-링크">8. 링크</h2>
<p><code>인라인 링크</code>와 <code>url</code>링크로 나타낼 수 있습니다.</p>
<p>✍ 작성법</p>
<pre><code>-인라인 링크 방식
[velog](https://velog.io/)

-url 링크 방식
&lt;https://velog.io/&gt;</code></pre><p>💻 결과</p>
<p><a href="https://velog.io/">velog</a></p>
<p><a href="https://velog.io/">https://velog.io/</a></p>
<hr>
<h2 id="9-이모지">9. 이모지</h2>
<p>다양한 <code>이모지</code>를 사용할 수 있습니다.
아래의 주소에서 복사, 붙여넣기 해서 사용하면 됩니다.</p>
<p><a href="https://kr.piliapp.com/facebook-symbols/">https://kr.piliapp.com/facebook-symbols/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git]_status]]></title>
            <link>https://velog.io/@acacia__u/Git</link>
            <guid>https://velog.io/@acacia__u/Git</guid>
            <pubDate>Wed, 14 Sep 2022 11:54:07 GMT</pubDate>
            <description><![CDATA[<h2 id="status">status</h2>
<p>Git으로 관리되는 파일은 일종의 &#39;상태 (status)&#39;를 가진다
상태는 크게 두가지로 나눠진다.</p>
<h3 id="1-untracked">1. Untracked</h3>
<p>추적되지 않고 있다는 뜻으로, Git에 의해 파일 변동사항이 전혀 추적되고 있지 않는 상태를 말한다. 예를 들어, 파일을 새로 생성하고 그 파일을 한 번도 git add 해주지 않았다면 이 상태로 존재한다.</p>
<h3 id="2-tracked">2. Tracked</h3>
<p>파일이 Git에 의해서 변동사항이 추적되고 있는 상태이다. 이 상태는 다시 그 특성에 따라 3가지 상태로 나눌 수 있다. </p>
<p>** 1) Staged 상태**</p>
<p>파일의 내용이 수정된 후에, staging area에 올라와있는 상태를 말한다.</p>
<blockquote>
<p>새로 생성한 파일이나 한번이라도 커밋에 포함됐었던 파일을 수정하고 git add를 했을 경우 이 상태에 놓여있다.</p>
</blockquote>
<p>** 2) Unmodified 상태**</p>
<p>최신 커밋의 모습과 비교했을 때 현재 파일 내용 상 바뀐 게 없다면 Unmodified(수정되지 않은, 변한 게 없는) 상태인 파일이다.</p>
<blockquote>
<p>커밋을 하고 난 직후에는 working directory 안의 모든 파일들이 이 상태가 된다.</p>
</blockquote>
<p>** 3) Modified 상태**</p>
<p>최신 커밋의 모습과 비교해보았을 때, 바뀐 내용이 있다면 Modified(수정된) 상태이다.</p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/ef78bb42-c105-4073-b0b1-159288e00e5f/image.png" alt=""></p>
<pre><code>Add the file 
: Untracked 상태의 파일을 처음으로 git add 해주면 Staged 상태가 됌

Edit the file 
: 최신 커밋과 비교했을 때 차이가 없는 Unmodified 상태의 파일의 내용을 수정했을 경우 Modified 상태가 됌.

Stage Modified file 
: Modified 상태의 파일을 git add 해주면 Staged 상태가 됌.

Remove the file 
: 파일을 삭제하면 당연히 Git에서 더이상 인식이 되지 않음

Commit 
: 커밋을 하면 staging area에 있던 파일들이 커밋에 반영되고, 이제 모든 파일들은 최신 커밋과 차이가 없게 되어 Unmodified 상태가 될 것. </code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[항해 사전 스터디 토이프로젝트 후기 및 회고_[9기]]]></title>
            <link>https://velog.io/@acacia__u/%ED%95%AD%ED%95%B4%EC%82%AC%EC%A0%84%EC%8A%A4%ED%84%B0%EB%94%94%ED%86%A0%EC%9D%98%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%ED%9B%84%EA%B8%B09%EA%B8%B0</link>
            <guid>https://velog.io/@acacia__u/%ED%95%AD%ED%95%B4%EC%82%AC%EC%A0%84%EC%8A%A4%ED%84%B0%EB%94%94%ED%86%A0%EC%9D%98%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%ED%9B%84%EA%B8%B09%EA%B8%B0</guid>
            <pubDate>Tue, 13 Sep 2022 11:38:59 GMT</pubDate>
            <description><![CDATA[<p>항해 본 커리큘럼 시작 전에 약 3주간 진행한 사전 스터디가 끝이 났다. 😆
그동안 스터디 팀원들끼리 웹 종합개발반 강의를 기한 맞춰 수강하기도 했고, 강의에서 배운것으로 작게 나마 토이 프로젝트를 진행해보기도 하였다. 그래서 오늘은 토의 프로젝트에서 나의 역할을 소개하고 소감을 작성해보려고 한다.</p>
<h1 style="color:green"> 1. 프로젝트 주제  </h1>

<p><b>프로젝트명</b>  </p>
<p><code>소</code>소한 <code>설</code>레임이 <code>만</code>개하는 <code>화</code>사한 공간</p>
<p>책의 장르 중 &#39;소설&#39;과 &#39;만화&#39;의 베스트셀러를 실시간으로 <strong>&#39;크롤링&#39;</strong> 해와서 보여주는 웹 사이트를 제작해보는 것을 주제로 삼았다. 
(추가적으로 <strong>날씨 정보 API</strong>도 받아와 실시간 보여줄 수 있도록 넣어놨다!)</p>
<p><strong>메인페이지</strong>
<img src="https://velog.velcdn.com/images/acacia__u/post/62183c3d-0595-4754-92c0-31d9653a4c9c/image.png" alt="">
메인페이지에서 각 버튼 클릭 시  <strong>상세 페이지</strong>로 이동
<img src="https://velog.velcdn.com/images/acacia__u/post/70d132bf-f67f-4fa1-995b-b1e55bed0291/image.png" alt=""></p>
<h1 style="color:green"> 2. 프로젝트에서 나의 역할</h1>

<h3 id="1-와이어프레임">1) <code>와이어프레임</code></h3>
<p> 모바일과 pc버전의 프레임을 각각 만들어보고 싶다는 조원들의 의견을 반영해 반응형 웹으로 구상했다!</p>
<h3 id="2-----html-전체">2)     <code>HTML 전체</code></h3>
<h3 id="3-파일병합--페이지-간-연결">3) <code>파일병합</code> &amp; <code>페이지 간 연결</code></h3>
<p>우리 조원들은 모두 &#39;깃&#39;을 사용할 줄 몰랐다. 프로젝트를 하며 &#39;깃&#39;을 사용하려고 노력해봤는데, 그게 잘 안되서 결국 하나하나 수작업으로💦 합치게 되었다. (내손내일...) 
py, html file이 각 3개씩이었는데, 지금까지 내가 만들어본 페이지는 하나의 py와 html 파일이 있었던 것이었기에 뭘 어떤식으로 합쳐야할까 처음에 너무 막막했다.</p>
<p>그래도 비교적 Html은 쉽게 연결할 수 있었는데...!
페이지 간 이동은 javascript로 페이지 리다이렉트를 구현하였는데, 나의 경우 버튼에 onclick()을 사용해 아래 코드와 함께 쉽게 연결에 성공했다.</p>
<pre><code class="language-javascript">window.location.href =&#39;/location&#39;</code></pre>
<p>연결 후 메인페이지와 연결 된 파이썬 파일을 실행시키면 날씨 API는 잘되었는데, 문제는 버튼을 통해 상세 페이지로 이동하면 다른 파이썬 파일이 작동이 안해, 크롤링 된 리스트들이 뜨지 않는다는 것이었다... 나니? 왜...?</p>
<p>정말 몇시간을 구글링해도 파이썬파일을 여러개 실행시키는 법을 모르겠었다. ㅠ
그러다 문득 파일을 하나로 합쳐본다면? 하는 생각이 들었다.
아래는 코드를 합친 과정 중 일부다!!</p>
<h4 id="파일을-합친-방식">파일을 합친 방식</h4>
<ul>
<li><p>메인 페이지를 app.py에서 app.route(&#39;/&#39;)으로 삼아줬다. 상세 페이지를 /뒤에 &#39;keyword&#39;를 붙여주는 식으로 연결  </p>
</li>
<li><p>파일명에 맞게 장식자 @app.route(&#39;/&#39;) 로 변경   </p>
<pre><code class="language-python">@novel.route(&quot;/novel/monthly&quot;, methods=[&quot;GET&quot;])
def web_novel_monthly_get():
  monthly_list = list(db.novelMonthly.find({}, {&#39;_id&#39;: False}))
  return jsonify({&#39;best_sellers2&#39;: monthly_list})</code></pre>
<p>⬇ </p>
<pre><code class="language-python">@app.route(&quot;/novel/monthly&quot;, methods=[&quot;GET&quot;])
def web_novel_monthly_get():
  monthly_list = list(db.novelMonthly.find({}, {&#39;_id&#39;: False}))
  return jsonify({&#39;best_sellers2&#39;: monthly_list})</code></pre>
</li>
</ul>
<br>

<p> 합치는 도중에 이곳 저곳 생겨난 에러에 당황하기를 오만번...!! 드디어 하나로 합쳐서 실행시킬 수 있었고, Flask가 어떤 식으로 실행되는건지 조금은 이해가기 시작했다.</p>
<h3 id="4-서버-배포">4) <code>서버 배포</code></h3>
<p>👉 <a href="https://velog.io/@acacia__u/5%EC%A3%BC%EC%B0%A8">5주차_서버배포</a>를 보고 다시 복습하는 느낌으로 했다.</p>
<h1 style="color:green">3. 마치며</h3>
예전부터 웹 페이지를 만들어 보고싶었는데, 이렇게 작게나마 사람들과 함께 협업해 웹을 만들어봤다는 것이 아주 특별한 경험이었다.

<p>특히나 단순히 강의를 따라만든 웹이 아니라, 우리가 기획하고 코드를 짜며 만들어 본 첫 프로젝트라 더욱 기억에 남을 것 같고 조원들도 모두 좋고 적극적이었어서 힘들지않았다.</p>
<p>아직 기능 부분에서 부족한 점이 많았지만, 시간이 조금 지나면 더 공부해서 이번보다 잘 해낼거라고 생각하기에 후회하지는 않는다. 내가 만들고 싶은 기능을 만들 수 있을 때까지 실력이 얼른 늘었으면 좋겠다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git]_repository & commit ]]></title>
            <link>https://velog.io/@acacia__u/GitGit%EC%8D%A8%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@acacia__u/GitGit%EC%8D%A8%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Mon, 12 Sep 2022 12:15:16 GMT</pubDate>
            <description><![CDATA[<h3 id="1-commit--repository-개념">1. commit / repository 개념</h3>
<ul>
<li><code>commit</code> [커밋]
프로젝트(working) 디렉토리의 특정 모습을 하나의 버전으로 남기는 행위 &amp; 결과물</li>
</ul>
<ul>
<li><code>repository</code> [저장소]
커밋이 저장되는 곳 
: 프로젝트 디렉토리의 각 버전이 담기는 저장소</li>
</ul>
<h3 id="2-repository-생성">2. repository 생성</h3>
<blockquote>
<p><strong>git</strong>은 내부적으로 <strong>3</strong>가지 종류의 <strong>작업 영역</strong>이 존재한다.</p>
</blockquote>
<p> <code>working directory</code>
     <strong>프로젝트 디렉토리</strong></p>
<p> <code>staging area</code>
     <strong>git add한 파일들이 존재하는 영역으로 이곳에 있는 파일들만 커밋에 반영된다</strong></p>
<p> <code>repository</code>
     <strong>working directory에 변경 이력들이 저장되어 있는 영역</strong></p>
<pre><code>working directory에서 뭔가 작업을 하고,
작업한 파일들을 git add 해주고,
커밋을 하면 staging area에 있던 파일들의 모습이 마치 영화의 한 
장면, 스냅샷(snapshot)처럼 이 repository에 저장되는 것.</code></pre><p> <img src="https://velog.velcdn.com/images/acacia__u/post/b278297c-31b7-4f9c-8d00-ebefc9d7385d/image.png" alt=""></p>
<h4 id="1--프로젝트-디렉토리-생성">1)  프로젝트 디렉토리 생성</h4>
<pre><code>mkdir MathTool  -&gt; directory 만들기</code></pre><p><img src="https://velog.velcdn.com/images/acacia__u/post/40033ec3-1177-4f18-baa9-f6ff384a5c76/image.png" alt="">
<strong>2) 프로젝트 디렉토리 버전관리를 위한 설정</strong></p>
<pre><code>git init  -&gt; git으로 프로젝트 디렉토리의 버전관리를 위한 설정</code></pre><p>  <img src="https://velog.velcdn.com/images/acacia__u/post/1b0b2225-1ee3-4d16-bbe6-bb1a298f8ace/image.png" alt=""></p>
<p>&quot; Initialized empty Git repository in /Users/kimjiae/MathTool/.git/&quot;
-&gt;  비어있는 레포지토리를 생성했다.</p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/53669dbc-c746-49e6-9274-16f1fc66d010/image.png" alt=""></p>
<p>  .git 디렉토리 (= repository)가 생성된 것을 확인할 수 있다  </p>
<h3 id="commit-해보기">commit 해보기</h3>
<p><strong>1) commit할 파일 directory에 저장</strong></p>
<p>MathTool에 bucketapp.py(파이썬 파일) 저장</p>
<p><img src="https://velog.velcdn.com/images/acacia__u/post/4fb15395-db2c-4e4f-a483-257ecf0bc52d/image.png" alt=""></p>
<p><strong>2) git config 설정</strong>
    -commit에 필요한 것
    * 이름
    * 이메일
     커밋 메세지(커밋에 관한 정보)</p>
<p>git에게 commit한 사람에 대한 정보 제공하기</p>
<pre><code>git config user.name &quot;______&quot;

git config user.email &quot;______&quot;</code></pre><p>  <img src="https://velog.velcdn.com/images/acacia__u/post/c2b2fc4a-63ea-4b66-886d-30cfd7556408/image.png" alt=""></p>
<p><strong>3) commit할 파일 지정하기</strong></p>
<pre><code>git add 파일명</code></pre><p> <img src="https://velog.velcdn.com/images/acacia__u/post/b79b8287-3651-49a6-84db-b00d1adaeef3/image.png" alt=""></p>
<p><strong>4. commit</strong></p>
<pre><code>git commit -m &quot; 커밋 메세지 &quot;</code></pre><p> <img src="https://velog.velcdn.com/images/acacia__u/post/8614e7c8-6673-4e6c-8671-1ae0bb81bf1d/image.png" alt=""></p>
<p>&quot;root-commit = 첫 번째 커밋&quot;
&quot;insertions = 커밋된 파일 줄 갯수&quot;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[4주차]_Flask, API 생성-클라이언트 연결]]></title>
            <link>https://velog.io/@acacia__u/4%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@acacia__u/4%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Mon, 12 Sep 2022 12:08:36 GMT</pubDate>
            <description><![CDATA[<h4 id="-로컬-개발-환경local">* 로컬 개발 환경(local)</h4>
<p>  :  &#39;내 컴퓨터에서 서버를 만들고, 내가 혼자 접속해보는 것&#39;</p>
<h1 id="1-flask기초">1. Flask기초</h1>
<h3 id="flask란">Flask란?</h3>
<p>Flask 프레임워크 
               : 서버를 구동시켜주는 편한 코드 모음
            &quot;프레임워크&quot;를 사용하지 않는다면 태양초를 빻아서 고추장을 만드는 격
            ( 프레임워크 = 3분 요리)</p>
<h3 id="flask-사용하기">Flask 사용하기</h3>
<p><strong>1) python package에서 flask설치!!</strong>
(+ db사용시 : dnspython, pymongo, certifi, 
크롤링 사용시 : requests, bs4 추가설치)</p>
<p><strong>2) import</strong></p>
<pre><code>from flask import Flask
app = Flask(__name__)

@app.route(&#39;/&#39;)
def home():
return &#39;This is Home!&#39;

if __name__ == &#39;__main__&#39;:
app.run(&#39;0.0.0.0&#39;,port=5000,debug=True)</code></pre><p>_  URL 나누기 방법 _</p>
<pre><code>@app.route(&#39;/&#39;)
def home():
return &#39;This is Home!&#39;

@app.route(&#39;/mypage&#39;)
def home():
return &#39;This is mypage!&#39;</code></pre><p><img src="https://velog.velcdn.com/images/acacia__u/post/ce768786-b5e0-40c6-bdd0-a45af73b0db8/image.png" alt=""></p>
<h3 id="기본-폴더구조">기본 폴더구조</h3>
<p>Flask 서버 생성시. 항상</p>
<blockquote>
<p>  프로젝트 폴더 내,
     L static 폴더(img, css 파일)
     L templates 폴더(html 파일)
     L app.py</p>
</blockquote>
<h3 id="html-py-연결하기">html-py 연결하기</h3>
<pre><code>from flask import Flask -&gt; 뒤 &#39;, render_template&#39;작성

@app.route(&#39;/&#39;)
def home():
return -&gt; 뒤 &#39;render_template(&#39;html파일명&#39;)&#39;</code></pre><h1 id="2--api-만들기">2.  API 만들기</h1>
<pre><code>API  =  은행창구
: 클라이언트가 요청할 시에도 &quot;방식&quot;이 존재한다.
클라이언트는 HTTP request method(요청 메소드)를 통해, 
어떤 요청 종류인지 응답하는 서버 쪽에 정보를 알려주는 것이다.</code></pre><p>1)** GET** :
    통상적으로 데이터 요청시에
       &gt; 데이터 전달 : url 뒤에 ?를 붙여 key=value로 전달
         ex. google.com?q=북극곰</p>
<p>  2) <strong>POST</strong> :
    통상적으로 데이터 생성, 변경, 삭제 요청시에
       &gt; 데이터 전달 : 보이지않는 html body에 key:value형태로 전달</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git]_Git시작하기]]></title>
            <link>https://velog.io/@acacia__u/GitGit%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@acacia__u/GitGit%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 11 Sep 2022 08:53:31 GMT</pubDate>
            <description><![CDATA[<h2 id="깃이란">&#39;깃&#39;이란?</h2>
<p>코드 버전 관리와 동시 협업을 가능하게 해주는  Tool</p>
<p> 버전관리란 파일의 변화를 시간에 따라 기록했다가, 이후 특정시점의 버전을 다시 꺼내올 수 있는 시스템을 말하는데 지난 과정을 확인 하거나, 이전 버전으로 돌아갈 수 있다는 장점을 갖고 있어 개발자들이 코드를 작성할 때 유용하게 사용된다. 
 git은 매번 작성하는 코드의 모습을 하나의 버전으로 저장할 수 있게 해주며, 여러 개발자들이 협업할 수 있는 기능도 갖추고 있다.               </p>
<h2 id="깃허브란">&#39;깃허브&#39;란?</h2>
<p>깃으로 관리하는 프로젝트를 올려둘 수 있는 원격저장소의 기능을 제공해주는 서비스이다.</p>
<h2 id="설치하기">설치하기</h2>
<h4 id="1-brew-설치">1. brew 설치</h4>
<p><a href="https://brew.sh/">https://brew.sh/</a>
<img src="https://velog.velcdn.com/images/acacia__u/post/8283fb62-7e2d-4ead-9b3e-7df6dfc7f93e/image.png" alt="">
 Install Homebrew 아래의 커맨드 복사 -&gt; terminal
    -&gt; enter -&gt; 맥 사용자 비밀번호 + enter
<img src="https://velog.velcdn.com/images/acacia__u/post/838ea7f2-9df6-4b00-933d-81d42bcff902/image.png" alt=""></p>
<h4 id="2-brew로-git설치-터미널-창-아래-코드-작성">2. brew로 git설치 (터미널 창 아래 코드 작성)</h4>
<pre><code>brew install git</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[3주차]_Python, 웹 스크래핑(크롤링), mongoDB]]></title>
            <link>https://velog.io/@acacia__u/3%EC%A3%BC%EC%B0%A8-oskjto6a</link>
            <guid>https://velog.io/@acacia__u/3%EC%A3%BC%EC%B0%A8-oskjto6a</guid>
            <pubDate>Sun, 11 Sep 2022 07:32:19 GMT</pubDate>
            <description><![CDATA[<h1 id="1-python">1. Python</h1>
<h3 id="python">Python</h3>
<p><strong>동적</strong> 타이핑 범용 프로그래밍 언어로, <strong>플랫폼 &quot;독립적&quot;</strong>으로 다양한 플랫폼을 사용 가능하며, 라이브러리(모듈)가 풍부하다. </p>
<h3 id="파이썬의-특징">파이썬의 특징</h3>
<ol>
<li>프로젝트 생성시 <em>venv</em>폴더 자동 생성: 안보이는 것으로 간주</li>
<li>매우 직관적인 언어로 중괄호, 세미콜론 등이 사용되지 않는다.</li>
<li>변수 정의 시 자료형을 따로 정해주지 않아도 된다.</li>
<li>줄 맞춰 작성하는 것이 아주 중요하다.</li>
</ol>
<pre><code class="language-python">ex)    a = 2
       b = 3

       print(a+b)   </code></pre>
<h3 id="파이썬-지식">파이썬 지식</h3>
<ul>
<li>자료형</li>
</ul>
<pre><code>1) 숫자, 문자형
2) 리스트형: 배열(자바스크립트와 동일)
3) Dictionary형(자바스크립트와 동일)
    -&gt; 리스트와 조합으로도 사용가능 </code></pre><ul>
<li><p>함수</p>
<pre><code>def로 시작</code></pre></li>
<li><p>조건문</p>
<pre><code class="language-python">if :
else:

________________________
or if is not ____:</code></pre>
</li>
</ul>
<ul>
<li>반복문<pre><code class="language-python">리스트와 함께 쓰이도록 고안되어 있다.
=&gt; for fruit in fruits:</code></pre>
</li>
</ul>
<h3 id="python-내장함수">Python 내장함수</h3>
<ol>
<li>리스트에 목록 추가<pre><code>        - append()</code></pre></li>
</ol>
<h1 id="2-스크래핑--크롤링">2. 스크래핑 &amp; 크롤링</h1>
<h3 id="스크래핑과-크롤링">스크래핑과 크롤링</h3>
<p>웹 서버에 저장된 데이터를 가져오는 행위를 <strong>웹 크롤링</strong> 혹은 <strong>웹 스크래핑</strong>이라 한다. 
<strong>&quot;웹 스크래핑&quot;</strong>은 웹사이트로부터 특정한 데이터만 가져오는 행위를 의미하며, <strong>&quot;웹 크롤링&quot;</strong>은 구글, 네이버, 다음과 같은 포털 사이트들이 인터넷에 있는 다수의 정보를 가져가는 행위를 말한다.</p>
<h3 id="크롤링-준비">크롤링 준비</h3>
<p>크롤링을 하기 위해서는 외부라이브러리(= 파이썬 패키지)를 사용해야한다!!! 
  L 프로젝트 별로 라이브러리를 모아둘 수 있게 설계되었음 
  (&#39;가상환경 = venv&#39;)</p>
<p>**   라이브러리**</p>
<p>1) requests 
일종의 ajax역할을 하는 것</p>
<pre><code class="language-python">import requests 
r = requests.get(&#39;url&#39;)
rjson = r.json()</code></pre>
<p>2) bs4(beautifulsoup) 
크롤링 시 찾고자 하는 내용(ex.제목 등)을 쉽게 찾도록 돕는 라이브러리</p>
<pre><code class="language-python">import requests
from bs4 import BeautifulSoup
headers = {&#39;User-Agent&#39; : &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36&#39;}
data =    requests.get(&#39;url&#39;,headers=headers)
soup = BeautifulSoup(data.text, &#39;html.parser&#39;</code></pre>
<h1 id="3-mongodb">3. mongoDB</h1>
<h3 id="db란">DB란?</h3>
<p>데이터를 잘 뽑아쓰기 위해 정리해놓는 것으로 &quot;프로그램&quot; 중 하나 일 뿐이다
요즘은 cloud형태로 제공받아 사용하는 경우가 많다</p>
<h3 id="db의-종류">DB의 종류</h3>
<p>1) SQL 
정형화 되어 데이터를 쌓는 것       -mysql</p>
<p>2) NOSQL 
비정형화 되어 유연하게 쌓는 것 - mongodb</p>
<h3 id="mongodb">mongoDB</h3>
<p>-&gt; 트래픽 대응에 편리하다는 장점이 있음
           -&gt; mongoDB Atlas : 클라우드 환경에서 제공하는 db프로그램</p>
<h3 id="mongodb-사용방법">mongoDB 사용방법</h3>
<p>package 설치 : <code>dnspython</code>, <code>pymongo</code> , <code>certifi</code></p>
<pre><code class="language-python">from pymongo import MongoClient
import certifi

ca = certifi.where()
client = MongoClient(&#39;mongodb+srv://username:&lt;password&gt;@cluster0.hvkrheo.mongodb.net/?retryWrites=true&amp;w=majority&#39;, tlsCAFile=ca)
db = client.dbsparta</code></pre>
<pre><code class="language-python"># 저장 - 예시
doc = {&#39;name&#39;:&#39;bobby&#39;,&#39;age&#39;:21}
db.users.insert_one(doc)</code></pre>
<pre><code class="language-python"># 한 개 찾기 - 예시
user = db.users.find_one({&#39;name&#39;:&#39;bobby&#39;})</code></pre>
<pre><code class="language-python">#여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{&#39;_id&#39;:False}))</code></pre>
<pre><code class="language-python"># 바꾸기 - 예시
db.users.update_one({&#39;name&#39;:&#39;bobby&#39;},{&#39;$set&#39;:{&#39;age&#39;:19}})</code></pre>
<pre><code> # 지우기 - 예시
db.users.delete_one({&#39;name&#39;:&#39;bobby&#39;})</code></pre><hr>
]]></description>
        </item>
    </channel>
</rss>