<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>goguma_03.log</title>
        <link>https://velog.io/</link>
        <description>달달고구마</description>
        <lastBuildDate>Mon, 07 Jul 2025 14:50:59 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>goguma_03.log</title>
            <url>https://velog.velcdn.com/images/goguma_03/profile/d5f45db8-cf4c-4e50-9b1a-8d2bb0070636/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. goguma_03.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/goguma_03" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[JWT 개념]]></title>
            <link>https://velog.io/@goguma_03/JWT-%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@goguma_03/JWT-%EA%B0%9C%EB%85%90</guid>
            <pubDate>Mon, 07 Jul 2025 14:50:59 GMT</pubDate>
            <description><![CDATA[<p>Json Web Token은 JSON 객체를 안전하게 전송하기 위한 토큰 형식입니다.</p>
<h4 id="사용자에-대한-정보를-디지털-서명된-토큰으로-만들어-클라이언트와-서버가-주고받는-방식">사용자에 대한 정보를 디지털 서명된 토큰으로 만들어 클라이언트와 서버가 주고받는 방식</h4>
<hr>
<h3 id="jwt의-구조">JWT의 구조</h3>
<p>JWT는 세 부분으로 구성됩니다. 각각은 &#39;.&#39;으로 구분됩니다.</p>
<blockquote>
<p>xxxxx.yyyyy.zzzzz</p>
</blockquote>
<table>
<thead>
<tr>
<th>구성 요소</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Header</strong></td>
<td>토큰의 타입 (JWT) 및 해싱 알고리즘 (HS256 등)</td>
</tr>
<tr>
<td><strong>Payload</strong></td>
<td>실제 전달할 정보 (클레임이라고 부름)</td>
</tr>
<tr>
<td><strong>Signature</strong></td>
<td>위 두 개를 암호화한 서명 (위조 방지용)</td>
</tr>
</tbody></table>
<h4 id="1-header">1. Header</h4>
<blockquote>
<p>{
  &quot;alg&quot;: &quot;HS256&quot;,
  &quot;typ&quot;: &quot;JWT&quot;
}</p>
</blockquote>
<h4 id="2-payload">2. payload</h4>
<blockquote>
<p>{
  &quot;sub&quot;: &quot;1234567890&quot;,
  &quot;name&quot;: &quot;goguma&quot;,
  &quot;iat&quot;: 1516239022
}</p>
</blockquote>
<h4 id="3-signature">3. signature</h4>
<blockquote>
<p>HMACSHA256(
  base64UrlEncode(header) + &quot;.&quot; +
  base64UrlEncode(payload),
  secret
)</p>
</blockquote>
<hr>
<h3 id="특징과-장점">특징과 장점</h3>
<table>
<thead>
<tr>
<th>장점</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>✅ 무상태(stateless)</td>
<td>서버에서 세션을 저장하지 않아도 됨</td>
</tr>
<tr>
<td>✅ 확장성</td>
<td>인증 서버 분산에 유리</td>
</tr>
<tr>
<td>✅ Self-contained</td>
<td>필요한 정보를 모두 토큰에 포함</td>
</tr>
</tbody></table>
<h3 id="주의할-점">주의할 점</h3>
<p>JWT는 변조 방지는 가능하지만 암호화되지 않음 → 민감한 정보 금지</p>
<p>토큰 탈취 시, 만료 시간까지는 재사용 가능 → 반드시 HTTPS 사용</p>
<p>서버에서 토큰 폐기 불가 → 보통 Redis 등을 함께 사용해 블랙리스트 관리</p>
<hr>
<h3 id="jwt-사용-예시-로그인-인증">JWT 사용 예시 (로그인 인증)</h3>
<p>1.사용자가 로그인</p>
<p>2.서버가 JWT를 생성해 클라이언트에 전달</p>
<p>3.클라이언트는 JWT를 로컬에 저장 (예: localStorage)</p>
<p>4.이후 요청 시 Authorization: Bearer <JWT> 헤더로 전달</p>
<p>5.서버는 토큰 검증 후 인증 처리</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SpringBoot 기본기 다지기]]></title>
            <link>https://velog.io/@goguma_03/SpringBoot-%EA%B8%B0%EB%B3%B8%EA%B8%B0-%EB%8B%A4%EC%A7%80%EA%B8%B0</link>
            <guid>https://velog.io/@goguma_03/SpringBoot-%EA%B8%B0%EB%B3%B8%EA%B8%B0-%EB%8B%A4%EC%A7%80%EA%B8%B0</guid>
            <pubDate>Sun, 01 Jun 2025 14:07:31 GMT</pubDate>
            <description><![CDATA[<p>참고자료:<a href="https://youtu.be/AalcVuKwBUM?si=ImfOODeOUYhJPXZe">링크</a></p>
<blockquote>
<p><strong>스프링</strong>: 다양한 기능을 제공하는 프레임 워크</p>
</blockquote>
<blockquote>
<p><strong>스프링부트</strong>: 자동설정을 이용해 쉽고 간단하게 스프링 기반의 어플리케이션을 만들 수 있다.</p>
</blockquote>
<hr>
<h3 id="mvc-패턴">MVC 패턴</h3>
<p>:디자인 패턴 주 하나로 어플리케이션을 구성할 때 구 구성요소를 세가지의 역할로 구분한 패턴을 의미-&gt;사용자 인터페이스로 부터 비즈니스 로직을 분리하여 서로 영향 없이 쉽게 고칠 수 있는 설계가 가능</p>
<blockquote>
<p>•<strong>Controller</strong>(중간다리)
•<strong>Model</strong>(데이터 처리)
•<strong>View</strong>(화면)</p>
</blockquote>
<hr>
<h3 id="rest-api">Rest API</h3>
<blockquote>
<p><strong>API</strong>: 응용 프로그램에서 사용할 수 있도록 다른 응용 프로그램을 제어할 수 있게 만든 인터페이스를 뜻함</p>
</blockquote>
<blockquote>
<p><strong>Rest</strong>: 자원의 이름으로 구분하요 해당 자원의 상태를 교환하는 것의 의미(서버와 클라이언트의 통신방식 中 1)</p>
</blockquote>
<pre><code>• **Server-Client 구조** 
    자원이 있는 쪽이 Server, 요청하는 쪽이 Client. 클라이언트와 서버가 독립적으로 분리되어 있어야 함
 • **Stateless**
요청 간에 클라이언트 정보가 서버에 저장되지 않음. 서버는 각각의 요청을 완전히 별개의 것으로 인식하고 처리
• **Cacheable**
HTTP 프로토콜을 그대로 사용하기 때문에 HTTP의 특징인 캐싱 기능을 적용. 대량의 요청을 효율적으로 처리하기 위해 캐시를 사용</code></pre><h4 id="rest-api-설계-규칙">REST API 설계 규칙</h4>
<pre><code>웹 기반의 REST API를 설계할 경우에는 URL을 통해 자원을 표현해야한다.

자원에 대한 조작은 HTTP Method를 통해 표현해야 한다.
@GetMapping, @PostMapping, @PutMapping

메시지를 통한 리소스 조작</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[연합 스터디 2주차-영속성 컨텍스트, flush, dirty checking, rollback 전략, 관계 매핑과 트랜잭션 테스트]]></title>
            <link>https://velog.io/@goguma_03/%EC%97%B0%ED%95%A9-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%A3%BC%EC%B0%A8-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-flush-dirty-checking-rollback-%EC%A0%84%EB%9E%B5-%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91%EA%B3%BC-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@goguma_03/%EC%97%B0%ED%95%A9-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%A3%BC%EC%B0%A8-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-flush-dirty-checking-rollback-%EC%A0%84%EB%9E%B5-%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91%EA%B3%BC-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%ED%85%8C%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Sat, 31 May 2025 14:40:24 GMT</pubDate>
            <description><![CDATA[<h3 id="-학습-목표">### 학습 목표</h3>
<p>JPA의 내부 동작을 원리 수준에서 이해하고, 복잡한 관계 매핑과 트랜잭션을 테스트 코드로 검증한다.</p>
<h4 id="entitymanager와-영속성-컨텍스트의-생명-주기">EntityManager와 영속성 컨텍스트의 생명 주기</h4>
<p><strong>엔티티 매니저</strong>는 엔티티를 관리해 데이터베이스와 애플리케이션 사이에서 객체를 생성, 수정, 삭제하는 등의 역할을 한다. 
<strong>영속성 컨텍스트</strong>는 JPA의 중요한 특징 중 하나로, 엔티티를 관리하는 가상 공간이다.
이것 덕분에 데이터베이스에서 효과적으로 데이터를 가져올 수 있고, 엔티티를 편하게 사용할 수 있다.</p>
<p>생명주기를 관리하는 영속성 컨텍스트에 엔티티 객체를 관리할 수 있는 메서드들을 제공한다. 
EntityManager가 제공하는 persist(), remove(), flush(), getReference()같은 메서드를 사용하면 엔티티 객체를 영속성 컨텍스트에 저장•삭제•조회할 수 있다.</p>
<p>이 과정에서 엔티티는 총 4가지 상태를 거친다:</p>
<p>비영속 (Transient):    JPA와 전혀 관계없는 상태<br>영속 (Persistent):    영속성 컨텍스트가 관리 중<br>준영속 (Detached):        관리가 끊긴 상태<br>삭제 (Removed):        삭제 예정 상태</p>
<h4 id="dirty-checking">dirty checking</h4>
<p>영속 상태의 엔티티가 변경되었을 때, JPA가 트랜잭션 커밋 시점에 변경된 필드만 감지해 자동으로 UPDATE 쿼리를 생성하는 <strong>기능</strong>이다.
<em>dirty checking은 영속 상태의 엔티티에서만 작동한다.
준영속 상태(detached)에서는 값이 바뀌어도 감지되지 않는다.</em></p>
<h3 id="rollback-전략">rollback 전략</h3>
<p><strong>롤백(Rollback)</strong>은 트랜잭션 처리 중 오류가 발생했을 때, 해당 트랜잭션에서 수행된 모든 작업을 취소하고 이전 상태로 되돌리는 것을 말한다. JPA에서는 @Transactional 어노테이션을 통해 트랜잭션을 선언하고, 예외 발생 시 자동으로 롤백을 수행한다.</p>
<p>Spring의 기본 롤백 전략은 다음과 같다:</p>
<p>RuntimeException 또는 Error가 발생하면 자동으로 롤백된다.</p>
<p>Checked Exception(예: IOException)은 기본적으로 롤백되지 않고 트랜잭션이 커밋된다.</p>
<h3 id="관계-매핑과-트랜잭션-테스트">관계 매핑과 트랜잭션 테스트</h3>
<p><strong>관계 매핑</strong>은 JPA에서 객체 간의 연관관계를 설정하는 것을 말하며, 실제 DB의 외래 키와 연결된다. 대표적으로 @OneToMany, @ManyToOne, @OneToOne, @ManyToMany 어노테이션을 사용한다.</p>
<p>연관관계 주인: 외래 키를 가진 엔티티. 주인만 관계를 변경할 수 있음.</p>
<p>Cascade: 부모 엔티티의 저장/삭제가 자식에게 전파됨 (cascade = ALL 등)</p>
<p>orphanRemoval: 부모와의 관계가 끊긴 자식 엔티티를 자동 삭제</p>
<p>FetchType.LAZY: 연관 엔티티를 실제 사용할 때 로딩 (성능 최적화)</p>
<p><strong>트랜잭션 테스트</strong>는 @Transactional 안에서 관계 매핑이 잘 작동하는지 확인하는 과정이다. 저장 시 cascade, 삭제 시 orphanRemoval이 제대로 동작하는지 테스트 코드로 검증한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SpringBoot 게시판 만들기(4)]]></title>
            <link>https://velog.io/@goguma_03/SpringBoot-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B04</link>
            <guid>https://velog.io/@goguma_03/SpringBoot-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B04</guid>
            <pubDate>Sun, 25 May 2025 13:01:58 GMT</pubDate>
            <description><![CDATA[<h3 id="페이징-처리-1">페이징 처리 //1</h3>
<blockquote>
<p>Pageable은 데이터를 페이지 단위로 나누어 조회할 수 있게 해주는 인터페이스다.
Pageable은 Spring Data JPA에서 페이징 처리 정보를 담는 객체다.
page, size, sort 정보를 담고 있다.
 | <code>page</code> | 현재 페이지 번호 (0부터 시작) 
| <code>size</code> | 한 페이지에 보여줄 데이터 개수<br>| <code>sort</code> | 정렬 기준             </p>
</blockquote>
<p>BoardController.java에서 boardlist를 수정한다.</p>
<pre><code> @GetMapping(&quot;/board/list&quot;)
    public String boardList(Model model, @PageableDefault(page = 0, size = 10, sort = &quot;id&quot;, direction = Sort.Direction.DESC) Pageable pageable){

        model.addAttribute(&quot;list&quot;, boardService.boardList(pageable));
        return &quot;boardlist&quot;;
    }</code></pre><p>BoardService.java에서 boardlist를 수정한다.</p>
<pre><code>  public Page&lt;Board&gt; boardList(Pageable pageable){
        return boardRepository.findAll(pageable);
    }
</code></pre><p><img src="https://velog.velcdn.com/images/goguma_03/post/06b59102-b1f8-4522-8dd8-7b075ecd7ba8/image.png" alt=""></p>
<h3 id="페이징-처리-2">페이징 처리 //2</h3>
<p>BoardController.java에서 boardlist를 수정한다.</p>
<pre><code>@GetMapping(&quot;/board/list&quot;)
    public String boardList(Model model, @PageableDefault(page = 0, size = 10, sort = &quot;id&quot;, direction = Sort.Direction.DESC) Pageable pageable){

        Page&lt;Board&gt; list = boardService.boardList(pageable);
        int nowPage = list.getPageable().getPageNumber() + 1;
        int startPage=Math.max(nowPage-4,1);
        int  endPage = Math.min(nowPage + 5, list.getTotalPages());

        model.addAttribute(&quot;list&quot;, list);
        model.addAttribute(&quot;nowPage&quot;, nowPage);
        model.addAttribute(&quot;startPage&quot;, startPage);
        model.addAttribute(&quot;endPage&quot;, endPage);
        return &quot;boardlist&quot;;
    }</code></pre><p>boardlist.html을 수정한다.
<img src="https://velog.velcdn.com/images/goguma_03/post/2de98101-9e5e-4f66-817b-56d2d1a27763/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/goguma_03/post/372fec13-63e5-459f-b63d-fa57e7e28649/image.png" alt=""></p>
<h3 id="검색기능-1">검색기능 //1</h3>
<h4 id="jpa-repository">JPA Repository</h4>
<blockquote>
<p>•findBy(컬럼 이름) -&gt; 컬럼에서 키워드를 넣어 찾는다. //정확하게 키워드가 일치하는 데이터만 검색
•findBy(컬럼 이름)containing -&gt; 컬럼에서 키워드가 포함된 것을 찾는다. //키워드가 포함된 모든 데이터 검색</p>
</blockquote>
<p>BoardRepository.java를 수정한다.</p>
<pre><code>public interface BoardRepository extends JpaRepository&lt;Board,  Integer&gt; {

    Page&lt;Board&gt; findByTitleContaining(String searchKeyword, Pageable pageable);
}</code></pre><p>BoardService.java에서 boardsearchList 메소드 추가한다.</p>
<pre><code>public Page&lt;Board&gt; boardsearchList(String searchKeyword, Pageable pageable){
        return boardRepository.findByTitleContaining(searchKeyword, pageable);
    }</code></pre><p>BoardController.java에서 boardlist를 수정한다.</p>
<pre><code>@GetMapping(&quot;/board/list&quot;)
    public String boardList(Model model,
                            @PageableDefault(page = 0, size = 10, sort = &quot;id&quot;, direction = Sort.Direction.DESC) Pageable pageable,
                            @RequestParam(value = &quot;searchKeyword&quot;, required = false) String searchKeyword){
        Page&lt;Board&gt; list = null;
        if(searchKeyword == null) {
           list = boardService.boardList(pageable);
        }else {
            list = boardService.boardsearchList(searchKeyword, pageable);
        }
        int nowPage = list.getPageable().getPageNumber() + 1;
        int startPage=Math.max(nowPage-4,1);
        int  endPage = Math.min(nowPage + 5, list.getTotalPages());

        model.addAttribute(&quot;list&quot;, list);
        model.addAttribute(&quot;nowPage&quot;, nowPage);
        model.addAttribute(&quot;startPage&quot;, startPage);
        model.addAttribute(&quot;endPage&quot;, endPage);
        return &quot;boardlist&quot;;
    }</code></pre><p><img src="https://velog.velcdn.com/images/goguma_03/post/ab4495ad-eaf8-4641-8989-95f4b235c968/image.png" alt=""></p>
<h3 id="검색기능-2">검색기능 //2</h3>
<blockquote>
<p>기존에 검색기능은 페이지를 넘어갈 때 검색했던 키워드 안에서 넘어가는 게 아니라 전체 페이지에서 다음 페이지로 넘어가는 문제가 있었다. 이 문제를 해결하기 위해서 수정한다.</p>
</blockquote>
<p>boardlist.html을 수정한다.</p>
<pre><code> &lt;th:block th:each=&quot;page : ${#numbers.sequence(startPage, endPage)}&quot;&gt;
        &lt;a th:if=&quot;${page !=nowPage}&quot; th:href=&quot;@{/board/list(page = ${page -1}, searchKeyword = ${param.searchKeyword})}&quot; th:text=&quot;${page}&quot;&gt;&lt;/a&gt;
        &lt;strong th:if = &quot;${page == nowPage}&quot; th:text=&quot;${page}&quot; style=&quot;color : red&quot;&gt;&lt;/strong&gt;
    &lt;/th:block&gt;</code></pre><blockquote>
<p>검색창을 구현하다.</p>
</blockquote>
<p>boardlist.html을 수정한다.</p>
<pre><code>  &lt;th:block th:each=&quot;page : ${#numbers.sequence(startPage, endPage)}&quot;&gt;
        &lt;a th:if=&quot;${page !=nowPage}&quot; th:href=&quot;@{/board/list(page = ${page -1}, searchKeyword = ${param.searchKeyword})}&quot; th:text=&quot;${page}&quot;&gt;&lt;/a&gt;
        &lt;strong th:if = &quot;${page == nowPage}&quot; th:text=&quot;${page}&quot; style=&quot;color : red&quot;&gt;&lt;/strong&gt;
    &lt;/th:block&gt;
    &lt;form th:action=&quot;@{/board/list}&quot; method=&quot;get&quot;&gt;
        &lt;input type = &quot;text&quot; name=&quot;searchKeyword&quot;&gt;
        &lt;button type = &quot;submit&quot;&gt;검색&lt;/button&gt;
    &lt;/form&gt;</code></pre><p><img src="https://velog.velcdn.com/images/goguma_03/post/a2c1f422-be29-4db7-94f4-739f118e74c5/image.png" alt=""></p>
<blockquote>
<p>🔥 Study :[스프링부트] 게시판 무작정 따라하기 끝까지!
❓ Problem :검색기능 1편에서 BoardController.java에서 boardlist를 수정하는 데 영상이랑 내 버전이 달라서 내가 계속 추가해야하는 어노테이션들이 있어 복잡했다.
🚀 Try : 드디어 처음부터 끝까지 스프링부트 게시판 만들기를 끝냈지만 아직도 헷갈리는 부분도 많고 어려워서 나 혼자 영상에 의지하지 않고 진행해 봐야겠다.
🤔 Question : 타임리프 문법에 대해 더 알아봐야겠다. </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[연합 스터디 1주차-Bean LifeCycle, AOP (Aspect-Oriented Programming), Proxy 구조 이해, DispatcherServlet 흐름]]></title>
            <link>https://velog.io/@goguma_03/%EC%97%B0%ED%95%A9-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%A3%BC%EC%B0%A8-Bean-LifeCycle-AOP-Aspect-Oriented-Programming-Proxy-%EA%B5%AC%EC%A1%B0-%EC%9D%B4%ED%95%B4-DispatcherServlet-%ED%9D%90%EB%A6%84</link>
            <guid>https://velog.io/@goguma_03/%EC%97%B0%ED%95%A9-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%A3%BC%EC%B0%A8-Bean-LifeCycle-AOP-Aspect-Oriented-Programming-Proxy-%EA%B5%AC%EC%A1%B0-%EC%9D%B4%ED%95%B4-DispatcherServlet-%ED%9D%90%EB%A6%84</guid>
            <pubDate>Wed, 21 May 2025 14:58:57 GMT</pubDate>
            <description><![CDATA[<h3 id="-학습-목표">### 학습 목표</h3>
<p>스프링의 핵심 개념 (Bean LifeCycle, AOP, Proxy 등)을 내부 구조 중심으로 깊게 이해하고, DispatcherServlet의 흐름을 그림과 코드로 정리한다.</p>
<h3 id="1-bean-lifecycle">1. Bean LifeCycle</h3>
<p>1.Bean이란?
     ∙스프링에서는 우리가 만든 클래스 객체를 관리해준다-&gt;이 객체를 Bean이라고 함.</p>
<p>2.생명주기(LifeCycle)
    ∙Bean의 생명주기
    [생성] → [의존성 주입] → [초기화] → [소멸]</p>
<pre><code>∙객체 생성[@Component] 
∙의존성 주입[스프링에 필요한 다른 객체들을 넣어줌]
∙초기화[@PostConstruct] //스프링이 이 메서드를 Bean 생성 직후 자동 실행한다.
∙초기화(인터페이스)[@InitializingBean] 
∙소멸[@PreDestroy] 
∙소멸(인터페이스)[@DisposableBean]</code></pre><p>   <img src="https://velog.velcdn.com/images/goguma_03/post/5e7e61c8-808f-4c2f-b8d1-3f106c197014/image.png" alt=""></p>
<h3 id="2-aopaspect-oriented-programming">2. AOP(Aspect-Oriented Programming)</h3>
<p>1.AOP(관점 지향 프로그래밍)란?
교차 절단 문제를 분리하여 응용 프로그램의 다른 부분의 모듈성을 높이기 위한 패러다임.
간단하게 하자면, 코드에 끼워넣는 기술이다.</p>
<p><strong>주요 개념</strong>
<img src="https://velog.velcdn.com/images/goguma_03/post/a89c351a-b0c4-4691-85f0-4e18b249461f/image.png" alt=""></p>
<p><strong>Advice 종류</strong>
   <img src="https://velog.velcdn.com/images/goguma_03/post/e161a6be-64f6-4b86-bbab-93a538b8e5a4/image.png" alt=""></p>
<p><strong>spring aop 와 aspectj의 차이</strong>
스프링 AOP는 스프링 프레임워크의 일부로, 프록시 패턴을 기반으로 AOP를 구현한다.
반면, AspectJ는 컴파일 타임, 로드 타임, 런타임에 걸쳐 더 광범위한 AOP 지원을 제공하는 독립적인 프레임워크이다.</p>
<p>👉상황
<img src="https://velog.velcdn.com/images/goguma_03/post/30bf421e-5a0f-4f1d-92aa-f7a2d66d07ed/image.png" alt=""></p>
<p>👉AOP도입
<img src="https://velog.velcdn.com/images/goguma_03/post/11f24f1e-681b-41b2-ad5d-fc9d0d7eb01d/image.png" alt=""></p>
<h3 id="3-proxy-구조-이해">3. Proxy 구조 이해</h3>
<p>1.Proxy란?
프록시는 클라이언트와 서버 사이의 중계 역할을 하는 프로그램 또는 컴퓨터,
사용자가 인터넷에 접속할 때 프록시 서버를 거쳐 접속하는 것을 의미한다.</p>
<p>2.JDK Dynamic Proxy vs CGLIB Proxy
<img src="https://velog.velcdn.com/images/goguma_03/post/f892f8b7-05d0-46a8-bc47-f17d3b73d331/image.png" alt=""></p>
<p>3.AOP와 Proxy의 관계
AOP는 프록시 객체를 만들어서 우리 코드를 감싸는 방식으로 동작한다.</p>
<p>4.인터페이스 기반 vs 클래스 기반 AOP 적용 비교 
(1)공통 인터페이스 + 구현체
<img src="https://velog.velcdn.com/images/goguma_03/post/629e344a-1bb2-4ca9-8635-8b2a48ef55cc/image.png" alt="">
(2)클래스 기반 구현체
<img src="https://velog.velcdn.com/images/goguma_03/post/205847ce-1f20-4082-bfb9-db45db5c5f68/image.png" alt=""></p>
<p>(3)AOP Aspect
<img src="https://velog.velcdn.com/images/goguma_03/post/08b396fd-99a8-4ee9-99fe-e24a15f6127f/image.png" alt=""></p>
<p>5.ProxyFactory 직접 사용 실습
(1)ProxyFactory로 인터페이스 기반 AOP
<img src="https://velog.velcdn.com/images/goguma_03/post/e63c6f43-75e9-4fe6-9858-dd9d4cd9c89c/image.png" alt="">
(2)ProxyFactory로 클래스 기반 AOP
<img src="https://velog.velcdn.com/images/goguma_03/post/16152cee-37dd-43db-bdf8-ce03bc7a4e5f/image.png" alt=""></p>
<h3 id="4-dispatcherservlet-흐름">4. DispatcherServlet 흐름</h3>
<ol>
<li>DispatcherServlet란?
DispatcherServlet은 HTTP 프로토콜로 들어오는 모든 요청을 먼저 받아서 적합한 컨트롤러에 위임(Delegate request)는 역할.</li>
</ol>
<p>2.Client → DispatcherServlet → HandlerMapping → HandlerAdapter → Controller → ViewResolver → View → Response</p>
<p>| <strong>DispatcherServlet</strong> | 프론트 컨트롤러, 모든 요청의 진입점             |
| <strong>HandlerMapping</strong>    | 요청 URL을 어떤 Controller에 매핑할지 결정   |
| <strong>HandlerAdapter</strong>    | 실제로 컨트롤러를 실행할 수 있도록 어댑터 제공       |
| <strong>Controller</strong>        | 핵심 비즈니스 로직 수행                    |
| <strong>ViewResolver</strong>      | 논리적 뷰 이름을 물리적 뷰로 변환 (ex: JSP 파일) |
| <strong>View</strong>              | 최종 렌더링 단계 (HTML 응답 생성)           |</p>
<p><img src="https://velog.velcdn.com/images/goguma_03/post/f85499a7-4258-4cae-9c84-b4c96d818a84/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SpringBoot 게시판 만들기(3)]]></title>
            <link>https://velog.io/@goguma_03/SpringBoot-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B03</link>
            <guid>https://velog.io/@goguma_03/SpringBoot-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B03</guid>
            <pubDate>Sat, 03 May 2025 14:00:35 GMT</pubDate>
            <description><![CDATA[<p>한코딩 게시판 무작정 따라하기 게시글 상세 페이지 ~ 파일 업로드까지 따라하고 작성한다.</p>
<h2 id="게시글-상세-페이지">게시글 상세 페이지</h2>
<p>우선, boardview.html을 만들어준다. //이 html은 화면에 나올 부분이다.
그리고 BoardController.java에 가서 @getMapping으로 (&quot;/board/view&quot;)를 만든다.
return &quot;boardview&quot;;&lt;-방금만든 boardview.html를 리턴한다.
<img src="https://velog.velcdn.com/images/goguma_03/post/bb360714-c73e-4530-99d5-9e86edee2bab/image.png" alt=""></p>
<p>BoardSevice.java에서 
<img src="https://velog.velcdn.com/images/goguma_03/post/e8da7597-676f-4aff-bbdb-b1dd7c52f1a3/image.png" alt=""></p>
<p>BoardController.java에서 
<img src="https://velog.velcdn.com/images/goguma_03/post/13031de1-ea91-4a03-af6c-21850f0001d6/image.png" alt="">
@RequestParam(&quot;id&quot;)안하면 오류</p>
<p>boardview.html에서 thymeleaf 사용 시작
<img src="https://velog.velcdn.com/images/goguma_03/post/cfebefa7-9a53-46b3-b917-89011d8019d9/image.png" alt="">
boardlist.html
<img src="https://velog.velcdn.com/images/goguma_03/post/3c894627-6ee3-42a4-8819-1ba778888731/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/goguma_03/post/20e41196-7e1a-4dc9-87b3-796f5d539f69/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/goguma_03/post/8d74879f-e473-44ab-9762-b4b45a2e0f62/image.png" alt=""></p>
<h2 id="게시글-삭제">게시글 삭제</h2>
<p>1.BoardSevice.java에서 boardDelete를 메소드를 생성한다.
2.BoardController.java에서 @getmapping한다.
<img src="https://velog.velcdn.com/images/goguma_03/post/4ab4b802-a656-4437-b762-e143990d4670/image.png" alt="">
<img src="https://velog.velcdn.com/images/goguma_03/post/4a197583-ee89-4f71-8ec2-64cd1d92602d/image.png" alt=""></p>
<h2 id="게시글-수정">게시글 수정</h2>
<p>1.boardmodify.html을 만든다.-&gt;boardwrite.html을 복붙한다.
2.boardview.html에서 body부분에  a태그로 추가-&gt;&quot;&lt;th:href=&quot;@{/board/modify/{id}(id = ${board.id})}&quot;&gt;수정&quot;
3.BoardController.java에서 @getmapping한다.(여기서 @PathVariable를 사용)</p>
<p>****@PostMapping(&quot;/board/update/{id}&quot;)
    public String boardUpdate(@PathVariable (&quot;id&quot;) Integer id, Board board){</p>
<pre><code>    Board boardTemp = boardService.boardview(id);
    boardTemp.setTitle(board.getTitle());
    boardTemp.setContent(board.getContent());

    boardService.write(boardTemp);
    return &quot;redirect:/board/list&quot;;
}****</code></pre><p>4.데이터가 담겨져 옮겨와서 수정할 수 있게 하고 적용되게 한다.-&gt;boardmodify.html에서
<img src="https://velog.velcdn.com/images/goguma_03/post/b339eb85-95f9-41fe-b6f3-39c3f639452d/image.png" alt=""></p>
<h2 id="메시지-띄우기">메시지 띄우기</h2>
<p>1.message.html을 만든다
<img src="https://velog.velcdn.com/images/goguma_03/post/5db2c5a0-0174-4f55-ab32-5723b1f94934/image.png" alt=""></p>
<p>2.BoardController.java를 수정한다.</p>
<p>****@PostMapping(&quot;/board/writedo&quot;)
    public String boardWritedo(Board board, Model model) {</p>
<pre><code>   boardService.write(board);
   model.addAttribute(&quot;message&quot;,&quot;글 작성이 완료되었습니다.&quot;);
   model.addAttribute(&quot;searchUrl&quot;,&quot;/board/list&quot;);
    return &quot;message&quot;;

}****</code></pre><p><img src="https://velog.velcdn.com/images/goguma_03/post/9f64be6f-25e6-4d40-86b2-ccf77847da40/image.png" alt="">
<img src="https://velog.velcdn.com/images/goguma_03/post/3b2a5a18-643d-4290-a5a6-6c9440b44af6/image.png" alt=""></p>
<h2 id="파일-업로드">파일 업로드</h2>
<p>1.mariaDB에서 테이블 board 수정
<img src="https://velog.velcdn.com/images/goguma_03/post/82169b3c-e409-4c7e-998e-063114cedefe/image.png" alt="">
2.entity의 Board.java에서 
    private String filename;
    private String filepath;
 추가</p>
<p>3.boardwrite.html의 body수정
<img src="https://velog.velcdn.com/images/goguma_03/post/9120b067-8b28-482a-836b-20a61f6d5281/image.png" alt=""></p>
<p>4.static밑의 files 디렉토리 생성
5.BoardService.java에서 write 메소드를 변경한다.
<img src="https://velog.velcdn.com/images/goguma_03/post/9531d38b-7d37-46d1-bda3-fe833fbcc92d/image.png" alt="">
6.BoardController.java를 수정한다.
 **** @PostMapping(&quot;/board/writedo&quot;)
    public String boardWritedo(Board board, Model model,@RequestParam(&quot;file&quot;) MultipartFile file) throws Exception {</p>
<pre><code>   boardService.write(board,file);
   model.addAttribute(&quot;message&quot;,&quot;글 작성이 완료되었습니다.&quot;);
   model.addAttribute(&quot;searchUrl&quot;,&quot;/board/list&quot;);
    return &quot;message&quot;;

}****</code></pre><p> **** @PostMapping(&quot;/board/update/{id}&quot;)
    public String boardUpdate(@PathVariable (&quot;id&quot;) Integer id, Board board,@RequestParam(&quot;file&quot;) MultipartFile file)throws Exception{</p>
<pre><code>    Board boardTemp = boardService.boardview(id);
    boardTemp.setTitle(board.getTitle());
    boardTemp.setContent(board.getContent());

    boardService.write(boardTemp, file);
    return &quot;redirect:/board/list&quot;;
}****</code></pre><p>7.오류가 발생하면 debug를 실행한다.
<img src="https://velog.velcdn.com/images/goguma_03/post/f7113076-def2-4b70-a623-27dd14c97338/image.png" alt="">
<img src="https://velog.velcdn.com/images/goguma_03/post/4c5e8f17-8b29-4b6b-ba3d-d7b6c42ba873/image.png" alt=""></p>
<p>🔥 Study :~파일업로드까지 수행
❓ Problem :중간에 어노테이션을 영상과 버전이 달라서 그런건지 뭔지 내가 붙여줘야 하는 게 많아서 오류날 때마다 많이 돌아다님. 
🚀 Try : 구조를 더 알아봐야겠다
🤔 Question : UUID를 좀 더 알아보고 싶다. CDATA도 뭐였는지 제대로 이해를 못해서 궁금하다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JPQL (객체지향 쿼리 언어)]]></title>
            <link>https://velog.io/@goguma_03/JPQL-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%BF%BC%EB%A6%AC-%EC%96%B8%EC%96%B4</link>
            <guid>https://velog.io/@goguma_03/JPQL-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%BF%BC%EB%A6%AC-%EC%96%B8%EC%96%B4</guid>
            <pubDate>Sat, 03 May 2025 10:26:38 GMT</pubDate>
            <description><![CDATA[<h4 id="우선-jpa를-이해야-jpql로-접근하기-좋다">우선 JPA를 이해야 JPQL로 접근하기 좋다.</h4>
<p>JPA는 자바 객체를 데이터베이스에 저장하고 꺼내기 쉽게 도와주는 기술로, 번거로웠던 JDBC보다 더 효율적인 방식이다.</p>
<p>JPA는 저장, 조회, 수정, 삭제를 할 수 있지만 <strong>복잡한 쿼리가 필요할 때 JPQL을 사용</strong>한다.</p>
<h2 id="jpql이란">JPQL이란?</h2>
<p><strong>JPQL</strong>(Java Persistence Query Language)은 <strong>JPA</strong>(Java Persistence API)에서 사용하는 객체지향 쿼리 언어이다. 
<em>일반적인 SQL과 다르게 데이터베이스 테이블이 아니라 자바 객체(Entity)를 대상으로 한다.</em>
<strong>종류</strong>=&gt;SELECT,UPDATE,DELETE (INSERT는 x)
예시)  <img src="https://velog.velcdn.com/images/goguma_03/post/aa70fc48-7243-46fa-a439-989f76bc6b2f/image.png" alt=""></p>
<p>JPQL에서 INSERT를 못하는 이유
JPQL은 객체(Entity)를 대상으로 하기 때문에!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SpringBoot 게시판 만들기(2)]]></title>
            <link>https://velog.io/@goguma_03/SpringBoot-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B02</link>
            <guid>https://velog.io/@goguma_03/SpringBoot-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B02</guid>
            <pubDate>Wed, 09 Apr 2025 11:59:01 GMT</pubDate>
            <description><![CDATA[<p>한코딩 게시판 무작정 따라하기 DB에 테이블 생성 ~ 게시글 리스트까지 따라하고 작성한다.</p>
<h2 id="db에-테이블-생성">DB에 테이블 생성</h2>
<p>MySQL workbench에서 MariaDB를 실행한다. board SCHEMAS를 누른 후 오른쪽 버튼을 클릭해 Create Table을 선택해서 table을 만든다. 
<img src="https://velog.velcdn.com/images/goguma_03/post/ad8e3540-7751-4f81-a36d-a3ebe43e8645/image.png" alt=""></p>
<p>•PK (Primary Key) = 테이블에서 각 행(row)을 &quot;유일하게&quot; 식별하는 값.
•NN (Not Null) = &quot;이 컬럼은 반드시 값이 있어야 한다&quot;는 의미.
•UQ (Unique) = 중복 값을 넣을 수 없음.
•B (Binary collation) = 문자형 컬럼에서 데이터를 저장하거나 비교할 때 대소문자 구분 없이가 아니라 이진(Binary) 방식으로 바이트 단위로 엄격하게 비교하겠다는 표시.
•UN (Unsigned) = 부호없음. 음수 X, 양수만 O. 숫자형 컬럼에만 적용 가능. 음수는 아예 저장하지 않겠다는 의미.
•ZF (Zero Fill) = 숫자형 컬럼에 적용 가능. 저장된 숫자 값을 고정된 길이로 표시할 때, 남는 자리 앞을 0 으로 채워서 보여주는 옵션.
    <em>주의: 실제 값이 바뀌는 게 아니라, 보여줄 때만 0 으로 채웁니다!</em>
•AI  (Auto Increment) = 숫자형 컬럼에 적용 가능. 새 레코드(행)가 추가될 때마다 자동으로 숫자를 1씩 증가시켜 저장.
•G (Generated Column) = 다른 컬럼을 기반으로 자동 계산되는 컬럼.</p>
<h2 id="게시글-작성폼-생성">게시글 작성폼 생성</h2>
<p>1.board.html생성
 resources밑에 templates에서 생성하면 된다.</p>
<p>  -HTML 기본 코드
<img src="https://velog.velcdn.com/images/goguma_03/post/c9338723-5d25-49a1-a223-b9fbeb0cd29c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/goguma_03/post/488dbbe3-a883-4b05-a5bf-b932ce23e36f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/goguma_03/post/33b786a1-0ccc-4e5c-8120-f45353ab549d/image.png" alt="">
<img src="https://velog.velcdn.com/images/goguma_03/post/d29a0db0-cdd3-4a9b-b482-aa98ad98ad5c/image.png" alt=""></p>
<h2 id="게시글-작성-처리">게시글 작성 처리</h2>
<p>게시글 작성폼 생성만으로는 내용을 작성해도 아무 일이 일어나지 않는다.
그러므로 게시글 작성 처리를 통해 동작하게 하자!
현재 데이터를 받는 태그가 input, textarea 두 개 있다.
이 태그들을 form 태그로 감싸줘야 한다. 
그리고 action을 통해 이 데이터들을 어디로 보내줄 것인지 정한다.
그리고 method를 통해 어떤 방식을 데이터를 넘겨 줄 것인지 정한다.
<img src="https://velog.velcdn.com/images/goguma_03/post/3871418f-4ee8-4ff4-8d5d-c8d80bf829a6/image.png" alt="">
데이터를 어떻게 보내줄지 정했으면 어떻게 받을지도 정해야 한다.
DB에 저장을 해야해서 repository, entity필요하다.
<img src="https://velog.velcdn.com/images/goguma_03/post/2a5ac840-48fd-468e-a2f0-03ff9a3bd3af/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/goguma_03/post/4ebd3733-7ed2-413f-9b4a-8525ff8fed38/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/goguma_03/post/5dee382c-af4c-40ae-885f-15babf2c5011/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/goguma_03/post/932be997-b5ae-4941-9fe4-5f0d34c72144/image.png" alt="">
<img src="https://velog.velcdn.com/images/goguma_03/post/bfbad68c-19f8-4c43-b97a-7fde26502383/image.png" alt=""></p>
<h2 id="게시글-리스트-페이지-생성">게시글 리스트 페이지 생성</h2>
<p>use board;
DELIMITER $$</p>
<p>CREATE PROCEDURE TEST()
BEGIN
    DECLARE i INT DEFAULT 1;</p>
<pre><code>WHILE i &lt;=120 DO
    INSERT INTO board(title, content)
    value(concat(&#39;제목&#39;, i), concat(&#39;내용&#39;,i));
        SET i=i+1;
        end while;
    end$$</code></pre><p>DELIMITER $$
        call TEST;
        <img src="https://velog.velcdn.com/images/goguma_03/post/ed5dea74-62ee-4798-9ad8-410b387c8a04/image.png" alt="">
        <img src="https://velog.velcdn.com/images/goguma_03/post/5e97c245-8fca-407e-90ee-85af2ed6ccc5/image.png" alt=""></p>
<p>🔥 Study :게시글 리스트 페이지 만들기
❓ Problem :중간에 getClass()만 되고 GetTitle()같은 애들은 작동이 안되서 계속 오류고쳐볼려고 했는데 결국 안됨.
🚀 Try : 구조를 더 알아봐야겠다
🤔 Question : 중간에 상속한 클래스에 대해 더 알아보고 싶다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JPA와 엔티티 연관관계]]></title>
            <link>https://velog.io/@goguma_03/JPA%EC%99%80-%EC%97%94%ED%8B%B0%ED%8B%B0-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84</link>
            <guid>https://velog.io/@goguma_03/JPA%EC%99%80-%EC%97%94%ED%8B%B0%ED%8B%B0-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84</guid>
            <pubDate>Wed, 09 Apr 2025 11:13:21 GMT</pubDate>
            <description><![CDATA[<h2 id="jpa">JPA</h2>
<p>JPA는 뭘까?
    Java Persistence API의 약자로, 자바에서 데이터베이스를 쉽게 다룰 수 있게 도와주는 기술 (표준 API)이다. 즉, 자바 클래스랑 데이터베이스 테이블을 연결해주는 다리역할이다.</p>
<p>왜 사용할까?
    원래 자바로 데이터베이스를 사용하려면 복잡하게 JDBC 코드로 SQL을 써야 하는데,
JPA를 쓰면 객체(Object)처럼 다룰 수 있어서 훨씬 편하게 데이터베이스와 연결하고 조작할 수 있다.
[자바 클래스와 DB 테이블을 매핑해서, 자바 코드만으로 데이터를 CRUD(Create, Read, Update, Delete)할 수 있게 해준다.]</p>
<h2 id="엔티티-연관관계">엔티티 연관관계</h2>
<p>엔티티는 뭘까?
    DB 테이블과 매칭되는 자바 클래스다.</p>
<p>연관관계는 뭘까?
    클래스(=엔티티) 사이를 연결하는 다리역할이다.</p>
<p>+추가적으로, 어노테이션이란! JPA가 일할 수 있도록 지시를 내리는 메모역할이다.</p>
<h1 id="jpa와-엔티티-연관관계-총정리">!JPA와 엔티티 연관관계 총정리!</h1>
<p>-사용 목적
“자바 코드로 데이터베이스를 쉽고 안전하게 다루는 것”</p>
<p>-사용 방법
“JPA를 써서 엔티티(클래스)를 DB와 연결하고, 어노테이션(지시서)으로 역할을 알려준다.”
-&gt;개발자는 자바 코드로 관계를 만들고, JPA가 알아서 데이터 베이스 실행.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[MVC 패턴과 CRUD]]></title>
            <link>https://velog.io/@goguma_03/MVC-%ED%8C%A8%ED%84%B4%EA%B3%BC-CRUD</link>
            <guid>https://velog.io/@goguma_03/MVC-%ED%8C%A8%ED%84%B4%EA%B3%BC-CRUD</guid>
            <pubDate>Sat, 05 Apr 2025 14:17:20 GMT</pubDate>
            <description><![CDATA[<h2 id="mvc-패턴">MVC 패턴</h2>
<p>코드 유지보수가 편해지는 코드 구성 방식 =&gt;MVC
<img src="https://velog.velcdn.com/images/goguma_03/post/011f48b7-8d38-48b6-91c0-8a483494e036/image.png" alt=""></p>
<p>Model: 데이터와 관련된 부분
View: 사용자한테 보여지는 부분
Controller: Model과 View를 이어주는 부분</p>
<p><strong>MVC를 지키며 코딩하는 방법</strong>
1.Model은 Controller와 View에 의존하지 않아야 한다.(내부에 Controller와 View에 관련된 코드가 있으면 안 된다.)
2.View는 Model에만 의존해야 하고, Controller에는 의존하면 안 된다.(View 내부에 Model 코드만 있을 수 있고, Controller의 코드가 있으면 안 된다.)
3.View가 Model로부터 데이터를 받을때는, 사용자마다 다르게 보여주어야 하는 데이터에 대해서만 받아야 한다.
4.Controller는 Model과 View에 의존해도 된다.(Controller 내부에는 Model과 View의 코드가 있을 수 있다.)
5.View가 Model로 부터 데이터를 받을 때, 반드시 Controller에서 받아야 한다.</p>
<h2 id="crud">CRUD</h2>
<p> RUD는 “Create, Read, Update, Delete”의 약어로 데이터베이스와 같은 시스템에서 기본적인 데이터 관리 기능을 의미한다.
 등록-&gt;조회-&gt;수정-&gt;삭제
 기능의 순서대로 앞글자를 따서 썼다.</p>
<p> CRUD가 중요한 이유:
 1.데이터 관리: 이 작업을 통해 응용 프로그램은 데이터를 효율적으로 관리하고 유지할 수 있다.
 2.기본 기능: 데이터 중심 응용 프로그램의 대부분은 CRUD를 기반으로 구축된다.
 3.유연성: CRUD 작업을 통해 데이터를 동적으로 관리할 수 있다.
 4.표준화: 데이터 조작에 대한 표준화를 제공한다.</p>
<p>🔥 Study : MVC 패턴과 CRUD에 대해 알아보았다. MVC 패턴은 모르고 있었는데 새로 알게 되어 좋았다.
❓ Problem : MVC 패턴을 지키며 코딩을 한다는 게 쉽지 않을 거 같다..</p>
<p>🚀 Try : MVC패턴과 CRUD를 이번 프로젝트에 적용해서 더 완성도 높게 만들어야지!!</p>
<p>🤔 Question : CRUD를 공부하며 RESTAPI와 관련이 있어보였는데 좀 더 알아보고 싶다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SpringBoot 게시판 만들기(1)]]></title>
            <link>https://velog.io/@goguma_03/SpringBoot-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B01</link>
            <guid>https://velog.io/@goguma_03/SpringBoot-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B01</guid>
            <pubDate>Sat, 05 Apr 2025 13:20:30 GMT</pubDate>
            <description><![CDATA[<p>** 스터디 1주차 **
 한코딩 게시판 만들기 진행했다.
 개발환경 세팅하고 프로젝트 생성까지 했다.</p>
<p> <em>개발환경 세팅</em>
 •IntelliJ Community 다운로드
 •MariaDB 다운로드
 •MySQl Workbench 다운로드</p>
<ul>
<li>프로젝트 생성*
•IntelliJ Community에서 Spring Boot 프로젝트 생성
•MariaDB Database(스키마)생성</li>
</ul>
<p>(1)기존에 인텔리제이를 설치했었어서 넘어갔다.
<img src="https://velog.velcdn.com/images/goguma_03/post/ecd98787-7335-41b1-b334-07bf3fdda75b/image.png" alt=""></p>
<p>(2)MariaDB를 설치함
<img src="https://velog.velcdn.com/images/goguma_03/post/0821caf4-592e-4bad-b88f-679aae39a714/image.png" alt="">
사진에 보면 첫번째 명령어로는 오류가 난다.
<strong>mysql -v</strong>
-v는 옵션으로 verbose 모드(상세 모드)를 의미한다.
즉, mysql을 &quot;상세 출력 모드&quot;로 실행한다.
But, 사용자, 비밀번호, 호스트 같은 걸 추가해야 접속이 가능하기 때문에 오류가 났다.</p>
<p><strong>mysql -u root -p</strong>
-u root는 사용자 이름(user). 여기서는 _root계정_을 사용
-p는 비밀번호를 입력하겠다는 옵션이다.
즉, cmd에서 MySQL 접속하고 싶다면 <em>mysql -u 사용자명 -p</em>을 기억하자!</p>
<p>(3)MySQL Workbench는 기존에 설치되어 있었기 때문에
<img src="https://velog.velcdn.com/images/goguma_03/post/05d3db0d-2278-4597-a532-d4c05a4cc703/image.png" alt="">
빨리빨리 해줍니다.
<img src="https://velog.velcdn.com/images/goguma_03/post/d1e7508c-dd0e-41d8-b083-4b9037da7997/image.png" alt=""></p>
<p>(4)프로젝트 생성
<img src="https://velog.velcdn.com/images/goguma_03/post/808db6e0-763e-4b10-b2dd-5ee949326db9/image.png" alt="">
완성!</p>
<p>🔥 Study :mariaDB를 cmd에서 연결하는 방법[CMD명령어]
          인텔리제이 프로젝트 생성[start.spring.io]
❓ Problem :포트 중복 오류<br>🚀 Try : 스프링부트 어노테이션을 더 알아보고 싶다
🤔 Question : 인텔리제이와 이클립스의 스프링부트 프로젝트를 할 때 차이점이 궁금하다. </p>
]]></description>
        </item>
    </channel>
</rss>