<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>jeonghoe21 님의 블로그</title>
    <link>https://jeonghoe21.tistory.com/</link>
    <description>jeonghoe21 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Wed, 22 Jul 2026 14:04:12 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>jeonghoe21</managingEditor>
    <item>
      <title>저장 프로시저</title>
      <link>https://jeonghoe21.tistory.com/34</link>
      <description>&lt;h3 data-end=&quot;1246&quot; data-start=&quot;1209&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;저장 프로시저 (Stored Procedure) 설명&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1381&quot; data-start=&quot;1248&quot; data-ke-size=&quot;size16&quot;&gt;저장 프로시저는 &lt;b&gt;반복적으로 실행해야 하는 쿼리나 비즈니스 로직&lt;/b&gt;을 &lt;b&gt;서버 측에서 미리 저장&lt;/b&gt;해놓고, 필요할 때마다 호출할 수 있는 SQL 코드입니다. 프로시저를 사용하면 성능 개선, 보안 강화, 코드 재사용 등의 이점이 있습니다.&lt;/p&gt;
&lt;h4 data-end=&quot;1403&quot; data-start=&quot;1383&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;저장 프로시저의 장점&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1722&quot; data-start=&quot;1404&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1465&quot; data-start=&quot;1404&quot;&gt;&lt;b&gt;성능 향상&lt;/b&gt;: 저장 프로시저는 &lt;b&gt;컴파일되고 메모리에 저장&lt;/b&gt;되어 반복 실행 시 빠르게 동작합니다.&lt;/li&gt;
&lt;li data-end=&quot;1548&quot; data-start=&quot;1466&quot;&gt;&lt;b&gt;서버/클라이언트 트래픽 감소&lt;/b&gt;: 저장 프로시저를 호출하는 것만으로 필요한 작업을 처리하므로, 많은 양의 데이터를 전송할 필요가 없습니다.&lt;/li&gt;
&lt;li data-end=&quot;1636&quot; data-start=&quot;1549&quot;&gt;&lt;b&gt;보안 강화&lt;/b&gt;: 데이터베이스의 테이블을 직접 접근하는 대신, 프로시저를 통해 작업을 수행하므로, SQL 인젝션 등의 보안 위험을 줄일 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;1722&quot; data-start=&quot;1637&quot;&gt;&lt;b&gt;유지보수 용이&lt;/b&gt;: SQL 문을 응용 프로그램 코드에서 분리하여 관리하므로, 수정 시 애플리케이션을 재배포하지 않고 프로시저만 수정하면 됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1746&quot; data-start=&quot;1724&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;저장 프로시저 생성 예시&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1742480734126&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE PROCEDURE [dbo].[USP_FINDPROCEDURE]
    @KEYWORD VARCHAR(100)  -- 입력 파라미터 정의
AS
BEGIN
    SET NOCOUNT ON;
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

    -- 쿼리문 실행
    SELECT SO.[NAME], SC.[TEXT]
    FROM SYSCOMMENTS SC
    INNER JOIN SYSOBJECTS SO
    ON SO.ID = SC.ID
    WHERE SC.TEXT LIKE '%' + @KEYWORD + '%';
END&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;121&quot; data-start=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;SET NOCOUNT ON;은 SQL Server에서 쿼리를 실행할 때, **행(row)**의 &lt;b&gt;수&lt;/b&gt;를 &lt;b&gt;결과로 반환하지 않도록 설정&lt;/b&gt;하는 명령입니다.&lt;/p&gt;
&lt;p data-end=&quot;121&quot; data-start=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 이 명령은 트랜잭션 격리 수준을 설정하는 명령입니다.&lt;/p&gt;
&lt;p data-end=&quot;121&quot; data-start=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;이 격리 수준에서는 다른 트랜잭션에서 아직 커밋되지 않은 데이터를 읽을 수 있습니다&lt;/p&gt;
&lt;p data-end=&quot;121&quot; data-start=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;121&quot; data-start=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;2323&quot; data-start=&quot;2301&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;저장 프로시저 호출 예시&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1742481375082&quot; class=&quot;sqf&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;EXEC dbo.USP_FINDPROCEDURE 'SM_USER_MST'; -- 'SM_USER_MST'&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;EXEC&lt;/span&gt;&lt;/span&gt;&lt;span&gt; dbo.USP_FINDPROCEDURE &lt;/span&gt;&lt;span&gt;&lt;span&gt;'SM_USER_MST'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 'SM_USER_MST'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2453&quot; data-start=&quot;2406&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 저장 프로시저를 호출하면, 프로시저 내의 쿼리문이 실행되며 결과가 반환됩니다.&lt;/p&gt;
&lt;h4 data-end=&quot;2475&quot; data-start=&quot;2455&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;저장 프로시저와 보안&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2647&quot; data-start=&quot;2476&quot; data-ke-size=&quot;size16&quot;&gt;저장 프로시저는 SQL 인젝션 공격에 대비하는 중요한 방법입니다. &lt;b&gt;동적 SQL&lt;/b&gt;을 사용하는 경우에는 &lt;b&gt;매개변수화된 쿼리&lt;/b&gt;를 사용하여 인젝션 공격을 예방할 수 있습니다. 예를 들어, LIKE 구문에서 사용되는 입력값은 반드시 파라미터로 전달하고, SQL문을 동적으로 생성하지 않는 것이 좋습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1742660419431&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE PROCEDURE CREATE_BOOK (
    @NAME NVARCHAR(100),        -- 책 이름
    @PUBLISHER NVARCHAR(50),    -- 출판사
    @AUTHOR NVARCHAR(50),       -- 저자
    @RETURN_CODE VARCHAR(1) OUTPUT -- 성공 여부를 나타내는 출력 매개변수
)
AS
BEGIN
    SET NOCOUNT ON; -- 결과로 영향을 받은 행의 개수를 표시하지 않음

    BEGIN TRY -- 트랜잭션 시작
        BEGIN TRAN -- 트랜잭션 시작

        -- 책 정보를 TBL_BOOK 테이블에 삽입
        INSERT INTO TBL_BOOK (NAME, PUBLISHER, AUTHOR)
        VALUES (@NAME, @PUBLISHER, @AUTHOR)

        COMMIT TRAN -- 트랜잭션 커밋
        SET @RETURN_CODE = 'S' -- 성공 코드 설정
    END TRY

    BEGIN CATCH -- 오류가 발생한 경우 처리
        ROLLBACK TRAN -- 트랜잭션 롤백
        SET @RETURN_CODE = 'E' -- 오류 코드 설정
    END CATCH

    SET NOCOUNT OFF -- 영향을 받은 행의 개수를 다시 표시
END&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2647&quot; data-start=&quot;2476&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;104&quot; data-start=&quot;81&quot; data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;저장 프로시저의 정의:&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;PROCEDURE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; CREATE_BOOK (&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;@NAME&lt;/span&gt;&lt;/span&gt;&lt;span&gt; NVARCHAR(&lt;/span&gt;&lt;span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 책 이름&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;@PUBLISHER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; NVARCHAR(&lt;/span&gt;&lt;span&gt;&lt;span&gt;50&lt;/span&gt;&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 출판사&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;@AUTHOR&lt;/span&gt;&lt;/span&gt;&lt;span&gt; NVARCHAR(&lt;/span&gt;&lt;span&gt;&lt;span&gt;50&lt;/span&gt;&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 저자&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;@RETURN_CODE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;VARCHAR&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) OUTPUT &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 성공 여부를 나타내는 출력 매개변수&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;521&quot; data-start=&quot;325&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;372&quot; data-start=&quot;325&quot;&gt;CREATE PROCEDURE는 새로운 저장 프로시저를 생성하는 명령어입니다.&lt;/li&gt;
&lt;li data-end=&quot;452&quot; data-start=&quot;373&quot;&gt;@NAME, @PUBLISHER, @AUTHOR는 입력 매개변수입니다. 이 매개변수들은 책의 이름, 출판사, 저자를 받아옵니다.&lt;/li&gt;
&lt;li data-end=&quot;521&quot; data-start=&quot;453&quot;&gt;@RETURN_CODE는 출력 매개변수입니다. 책 정보가 성공적으로 추가되면 'S', 실패하면 'E'를 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;542&quot; data-start=&quot;523&quot; data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;프로시저 본문:&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;BEGIN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; NOCOUNT &lt;/span&gt;&lt;span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 결과로 영향을 받은 행의 개수를 표시하지 않음&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;702&quot; data-start=&quot;613&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;702&quot; data-start=&quot;613&quot;&gt;SET NOCOUNT ON은 SQL Server에서 결과로 반환되는 영향을 받은 행 수를 표시하지 않도록 설정합니다. 이는 성능을 개선하는데 유용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;723&quot; data-start=&quot;704&quot; data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;트랜잭션 처리:&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;BEGIN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; TRY &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 트랜잭션 시작!&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;BEGIN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; TRAN &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 트랜잭션 시작&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;890&quot; data-start=&quot;784&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;890&quot; data-start=&quot;784&quot;&gt;BEGIN TRY는 트랜잭션을 시작하기 위한 예외 처리를 위한 구문입니다.&lt;/li&gt;
&lt;li data-end=&quot;890&quot; data-start=&quot;784&quot;&gt;트랜잭션이 정상적으로 수행될 경우, COMMIT이 실행되고, 예외가 발생하면 CATCH가 처리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;INSERT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;INTO&lt;/span&gt;&lt;/span&gt;&lt;span&gt; TBL_BOOK (NAME, PUBLISHER, AUTHOR) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;VALUES&lt;/span&gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&lt;span&gt;@NAME&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span&gt;@PUBLISHER&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span&gt;@AUTHOR&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 책 정보를 TBL_BOOK 테이블에 삽입&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1148&quot; data-start=&quot;1020&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1148&quot; data-start=&quot;1020&quot;&gt;INSERT INTO TBL_BOOK는 TBL_BOOK 테이블에 책 정보를 삽입하는 SQL 쿼리입니다. 입력된 매개변수 @NAME, @PUBLISHER, @AUTHOR를 사용하여 테이블에 데이터를 추가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;COMMIT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; TRAN &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 트랜잭션 커밋&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;@RETURN_CODE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;'S'&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 성공 코드 설정&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1345&quot; data-start=&quot;1227&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1280&quot; data-start=&quot;1227&quot;&gt;COMMIT TRAN은 트랜잭션을 성공적으로 종료하고 변경 사항을 확정하는 명령어입니다.&lt;/li&gt;
&lt;li data-end=&quot;1345&quot; data-start=&quot;1281&quot;&gt;SET @RETURN_CODE = 'S'는 프로시저가 성공적으로 실행되었음을 나타내는 출력 값을 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1372&quot; data-start=&quot;1347&quot; data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;예외 처리 (CATCH):&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;END&lt;/span&gt;&lt;/span&gt;&lt;span&gt; TRY &lt;/span&gt;&lt;span&gt;&lt;span&gt;BEGIN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; CATCH &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 오류가 발생한 경우 처리&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ROLLBACK&lt;/span&gt;&lt;/span&gt;&lt;span&gt; TRAN &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 트랜잭션 롤백&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;@RETURN_CODE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;'E'&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 오류 코드 설정&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;END&lt;/span&gt;&lt;/span&gt;&lt;span&gt; CATCH &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1668&quot; data-start=&quot;1500&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1541&quot; data-start=&quot;1500&quot;&gt;BEGIN CATCH는 트랜잭션 중 오류가 발생할 경우 실행됩니다.&lt;/li&gt;
&lt;li data-end=&quot;1607&quot; data-start=&quot;1542&quot;&gt;ROLLBACK TRAN은 오류가 발생했을 때, 이전의 모든 변경 사항을 취소하여 데이터 일관성을 유지합니다.&lt;/li&gt;
&lt;li data-end=&quot;1668&quot; data-start=&quot;1608&quot;&gt;SET @RETURN_CODE = 'E'는 프로시저 실행이 실패했음을 나타내는 출력 값을 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1689&quot; data-start=&quot;1670&quot; data-ke-size=&quot;size23&quot;&gt;5. &lt;b&gt;프로시저 종료:&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; NOCOUNT OFF &lt;/span&gt;&lt;span&gt;&lt;span&gt;END&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1833&quot; data-start=&quot;1722&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1801&quot; data-start=&quot;1722&quot;&gt;SET NOCOUNT OFF는 영향을 받은 행의 수를 다시 표시하도록 설정하는 명령어입니다. 이 설정은 트랜잭션이 끝난 후 복원됩니다.&lt;/li&gt;
&lt;li data-end=&quot;1833&quot; data-start=&quot;1802&quot;&gt;END는 저장 프로시저 본문을 끝내는 구문입니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL</category>
      <author>jeonghoe21</author>
      <guid isPermaLink="true">https://jeonghoe21.tistory.com/34</guid>
      <comments>https://jeonghoe21.tistory.com/34#entry34comment</comments>
      <pubDate>Fri, 21 Mar 2025 00:19:15 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 문법</title>
      <link>https://jeonghoe21.tistory.com/31</link>
      <description>&lt;h3 data-end=&quot;24&quot; data-start=&quot;0&quot; data-ke-size=&quot;size23&quot;&gt;1. 자바스크립트 문법과 이벤트 처리&lt;/h3&gt;
&lt;h4 data-end=&quot;45&quot; data-start=&quot;26&quot; data-ke-size=&quot;size20&quot;&gt;1.1. 자바스크립트 문법&lt;/h4&gt;
&lt;p data-end=&quot;204&quot; data-start=&quot;47&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 변수를 선언하는 방법은 let, const, var입니다. let은 재할당이 가능한 변수이고, const는 재할당이 불가능한 변수입니다. var는 ES6 이전 방식으로 사용되며, 최신 코드에서는 let과 const를 더 많이 사용합니다.&lt;/p&gt;
&lt;p data-end=&quot;209&quot; data-start=&quot;206&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;263&quot; data-start=&quot;210&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;235&quot; data-start=&quot;210&quot;&gt;let x = 10; // 재할당 가능&lt;/li&gt;
&lt;li data-end=&quot;263&quot; data-start=&quot;236&quot;&gt;const y = 20; // 재할당 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;280&quot; data-start=&quot;265&quot; data-ke-size=&quot;size20&quot;&gt;1.2. 함수 정의&lt;/h4&gt;
&lt;p data-end=&quot;364&quot; data-start=&quot;282&quot; data-ke-size=&quot;size16&quot;&gt;함수는 function 키워드로 정의할 수 있습니다. ES6에서 도입된 &lt;b&gt;화살표 함수&lt;/b&gt;는 더 짧고 간결하게 함수를 작성할 수 있게 해줍니다.&lt;/p&gt;
&lt;p data-end=&quot;375&quot; data-start=&quot;366&quot; data-ke-size=&quot;size16&quot;&gt;함수 선언 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;485&quot; data-start=&quot;376&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;435&quot; data-start=&quot;376&quot;&gt;function greet(name) { return 'Hello, ' + name + '!'; }&lt;/li&gt;
&lt;li data-end=&quot;485&quot; data-start=&quot;436&quot;&gt;console.log(greet('John')); // &quot;Hello, John!&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;497&quot; data-start=&quot;487&quot; data-ke-size=&quot;size16&quot;&gt;화살표 함수 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;563&quot; data-start=&quot;498&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;530&quot; data-start=&quot;498&quot;&gt;const add = (a, b) =&amp;gt; a + b;&lt;/li&gt;
&lt;li data-end=&quot;563&quot; data-start=&quot;531&quot;&gt;console.log(add(3, 4)); // 7&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;583&quot; data-start=&quot;565&quot; data-ke-size=&quot;size20&quot;&gt;1.3. 조건문과 반복문&lt;/h4&gt;
&lt;p data-end=&quot;667&quot; data-start=&quot;585&quot; data-ke-size=&quot;size16&quot;&gt;조건문(if, else if, else)과 반복문(for, while, forEach)을 사용하여 로직을 제어할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;676&quot; data-start=&quot;669&quot; data-ke-size=&quot;size16&quot;&gt;조건문 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;774&quot; data-start=&quot;677&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;694&quot; data-start=&quot;677&quot;&gt;let age = 18;&lt;/li&gt;
&lt;li data-end=&quot;774&quot; data-start=&quot;695&quot;&gt;if (age &amp;gt;= 18) { console.log('성인입니다.'); } else { console.log('미성년자입니다.'); }&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;783&quot; data-start=&quot;776&quot; data-ke-size=&quot;size16&quot;&gt;반복문 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;852&quot; data-start=&quot;784&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;852&quot; data-start=&quot;784&quot;&gt;for (let i = 0; i &amp;lt; 5; i++) { console.log(i); // 0, 1, 2, 3, 4 }&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;870&quot; data-start=&quot;854&quot; data-ke-size=&quot;size20&quot;&gt;1.4. 배열과 객체&lt;/h4&gt;
&lt;p data-end=&quot;907&quot; data-start=&quot;872&quot; data-ke-size=&quot;size16&quot;&gt;배열과 객체는 자바스크립트에서 자주 사용되는 데이터 구조입니다.&lt;/p&gt;
&lt;p data-end=&quot;915&quot; data-start=&quot;909&quot; data-ke-size=&quot;size16&quot;&gt;배열 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1004&quot; data-start=&quot;916&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;965&quot; data-start=&quot;916&quot;&gt;const fruits = ['apple', 'banana', 'cherry'];&lt;/li&gt;
&lt;li data-end=&quot;1004&quot; data-start=&quot;966&quot;&gt;console.log(fruits[0]); // 'apple'&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1012&quot; data-start=&quot;1006&quot; data-ke-size=&quot;size16&quot;&gt;객체 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1098&quot; data-start=&quot;1013&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1058&quot; data-start=&quot;1013&quot;&gt;const person = { name: 'John', age: 30 };&lt;/li&gt;
&lt;li data-end=&quot;1098&quot; data-start=&quot;1059&quot;&gt;console.log(person.name); // 'John'&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1103&quot; data-start=&quot;1100&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1125&quot; data-start=&quot;1105&quot; data-ke-size=&quot;size23&quot;&gt;2. 자바스크립트 이벤트 처리&lt;/h3&gt;
&lt;h4 data-end=&quot;1151&quot; data-start=&quot;1127&quot; data-ke-size=&quot;size20&quot;&gt;2.1. 이벤트 리스너 기본 사용법&lt;/h4&gt;
&lt;p data-end=&quot;1205&quot; data-start=&quot;1153&quot; data-ke-size=&quot;size16&quot;&gt;이벤트 리스너는 특정 이벤트가 발생했을 때 해당 이벤트를 처리하는 함수를 실행하는 방식입니다.&lt;/p&gt;
&lt;p data-end=&quot;1215&quot; data-start=&quot;1207&quot; data-ke-size=&quot;size16&quot;&gt;HTML 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1261&quot; data-start=&quot;1216&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1261&quot; data-start=&quot;1216&quot;&gt;&amp;lt;button id=&quot;clickButton&quot;&amp;gt;클릭해 주세요&amp;lt;/button&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1273&quot; data-start=&quot;1263&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1409&quot; data-start=&quot;1274&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1332&quot; data-start=&quot;1274&quot;&gt;const button = document.getElementById('clickButton');&lt;/li&gt;
&lt;li data-end=&quot;1409&quot; data-start=&quot;1333&quot;&gt;button.addEventListener('click', function() { alert('버튼이 클릭되었습니다!'); });&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1427&quot; data-start=&quot;1411&quot; data-ke-size=&quot;size20&quot;&gt;2.2. 이벤트 객체&lt;/h4&gt;
&lt;p data-end=&quot;1494&quot; data-start=&quot;1429&quot; data-ke-size=&quot;size16&quot;&gt;이벤트 처리 함수에서는 이벤트 객체를 매개변수로 받아 클릭한 위치나 키보드 입력 등의 상세 정보를 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;1504&quot; data-start=&quot;1496&quot; data-ke-size=&quot;size16&quot;&gt;HTML 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1550&quot; data-start=&quot;1505&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1550&quot; data-start=&quot;1505&quot;&gt;&amp;lt;button id=&quot;clickButton&quot;&amp;gt;클릭해 주세요&amp;lt;/button&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1562&quot; data-start=&quot;1552&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1734&quot; data-start=&quot;1563&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1621&quot; data-start=&quot;1563&quot;&gt;const button = document.getElementById('clickButton');&lt;/li&gt;
&lt;li data-end=&quot;1734&quot; data-start=&quot;1622&quot;&gt;button.addEventListener('click', function(event) { console.log('클릭한 위치:', event.clientX, event.clientY); });&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1755&quot; data-start=&quot;1736&quot; data-ke-size=&quot;size20&quot;&gt;2.3. 이벤트 전파 제어&lt;/h4&gt;
&lt;p data-end=&quot;1857&quot; data-start=&quot;1757&quot; data-ke-size=&quot;size16&quot;&gt;이벤트 버블링과 캡처링은 이벤트가 DOM 트리에서 전파되는 방식입니다. stopPropagation() 메서드를 사용하여 이벤트가 부모 요소로 전파되는 것을 막을 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;1867&quot; data-start=&quot;1859&quot; data-ke-size=&quot;size16&quot;&gt;HTML 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1930&quot; data-start=&quot;1868&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1930&quot; data-start=&quot;1868&quot;&gt;&amp;lt;div id=&quot;parent&quot;&amp;gt;&amp;lt;button id=&quot;child&quot;&amp;gt;클릭해 주세요&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1942&quot; data-start=&quot;1932&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2231&quot; data-start=&quot;1943&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1996&quot; data-start=&quot;1943&quot;&gt;const parent = document.getElementById('parent');&lt;/li&gt;
&lt;li data-end=&quot;2048&quot; data-start=&quot;1997&quot;&gt;const child = document.getElementById('child');&lt;/li&gt;
&lt;li data-end=&quot;2125&quot; data-start=&quot;2049&quot;&gt;parent.addEventListener('click', function() { alert('부모가 클릭되었습니다.'); });&lt;/li&gt;
&lt;li data-end=&quot;2231&quot; data-start=&quot;2126&quot;&gt;child.addEventListener('click', function(event) { alert('자식이 클릭되었습니다.'); event.stopPropagation(); });&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;2252&quot; data-start=&quot;2233&quot; data-ke-size=&quot;size20&quot;&gt;2.4. 이벤트 델리게이션&lt;/h4&gt;
&lt;p data-end=&quot;2353&quot; data-start=&quot;2254&quot; data-ke-size=&quot;size16&quot;&gt;이벤트 델리게이션은 부모 요소에 이벤트 리스너를 등록하여 자식 요소에서 발생한 이벤트를 처리하는 기법입니다. 이는 동적으로 추가된 자식 요소에 대해서도 이벤트 처리가 가능합니다.&lt;/p&gt;
&lt;p data-end=&quot;2363&quot; data-start=&quot;2355&quot; data-ke-size=&quot;size16&quot;&gt;HTML 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2496&quot; data-start=&quot;2364&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2496&quot; data-start=&quot;2364&quot;&gt;&amp;lt;div id=&quot;parent&quot;&amp;gt;&amp;lt;button class=&quot;child&quot;&amp;gt;버튼 1&amp;lt;/button&amp;gt;&amp;lt;button class=&quot;child&quot;&amp;gt;버튼 2&amp;lt;/button&amp;gt;&amp;lt;button class=&quot;child&quot;&amp;gt;버튼 3&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2508&quot; data-start=&quot;2498&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2734&quot; data-start=&quot;2509&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2562&quot; data-start=&quot;2509&quot;&gt;const parent = document.getElementById('parent');&lt;/li&gt;
&lt;li data-end=&quot;2734&quot; data-start=&quot;2563&quot;&gt;parent.addEventListener('click', function(event) { if (event.target &amp;amp;&amp;amp; event.target.matches('button.child')) { alert('버튼이 클릭되었습니다: ' + event.target.textContent); } });&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2739&quot; data-start=&quot;2736&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2777&quot; data-start=&quot;2741&quot; data-ke-size=&quot;size23&quot;&gt;3. 실무에서 자주 사용되는 자바스크립트 이벤트 처리 예시&lt;/h3&gt;
&lt;h4 data-end=&quot;2797&quot; data-start=&quot;2779&quot; data-ke-size=&quot;size20&quot;&gt;3.1. 폼 유효성 검사&lt;/h4&gt;
&lt;p data-end=&quot;2892&quot; data-start=&quot;2799&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 입력한 데이터가 유효한지 확인하는 폼 유효성 검사는 웹 애플리케이션에서 매우 중요합니다. 자바스크립트를 사용하여 폼 전송 전에 유효성 검사를 할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;2902&quot; data-start=&quot;2894&quot; data-ke-size=&quot;size16&quot;&gt;HTML 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3097&quot; data-start=&quot;2903&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3097&quot; data-start=&quot;2903&quot;&gt;&amp;lt;form id=&quot;loginForm&quot;&amp;gt;&amp;lt;input type=&quot;text&quot; id=&quot;username&quot; placeholder=&quot;사용자 이름&quot; required&amp;gt;&amp;lt;input type=&quot;password&quot; id=&quot;password&quot; placeholder=&quot;비밀번호&quot; required&amp;gt;&amp;lt;button type=&quot;submit&quot;&amp;gt;로그인&amp;lt;/button&amp;gt;&amp;lt;/form&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3109&quot; data-start=&quot;3099&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3434&quot; data-start=&quot;3110&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3164&quot; data-start=&quot;3110&quot;&gt;const form = document.getElementById('loginForm');&lt;/li&gt;
&lt;li data-end=&quot;3434&quot; data-start=&quot;3165&quot;&gt;form.addEventListener('submit', function(event) { const username = document.getElementById('username').value; const password = document.getElementById('password').value; if (username === '' || password === '') { alert('모든 필드를 채워주세요.'); event.preventDefault(); } });&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;3466&quot; data-start=&quot;3436&quot; data-ke-size=&quot;size20&quot;&gt;3.2. 동적인 콘텐츠 로딩 (AJAX 사용)&lt;/h4&gt;
&lt;p data-end=&quot;3540&quot; data-start=&quot;3468&quot; data-ke-size=&quot;size16&quot;&gt;웹 페이지에서 동적으로 데이터를 로드하는 예시로, AJAX를 사용하여 서버에서 데이터를 받아오고 페이지를 업데이트할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;3550&quot; data-start=&quot;3542&quot; data-ke-size=&quot;size16&quot;&gt;HTML 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3625&quot; data-start=&quot;3551&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3625&quot; data-start=&quot;3551&quot;&gt;&amp;lt;button id=&quot;loadDataBtn&quot;&amp;gt;데이터 로드&amp;lt;/button&amp;gt;&amp;lt;div id=&quot;dataContainer&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3637&quot; data-start=&quot;3627&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4021&quot; data-start=&quot;3638&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3701&quot; data-start=&quot;3638&quot;&gt;const loadDataBtn = document.getElementById('loadDataBtn');&lt;/li&gt;
&lt;li data-end=&quot;3769&quot; data-start=&quot;3702&quot;&gt;const dataContainer = document.getElementById('dataContainer');&lt;/li&gt;
&lt;li data-end=&quot;4021&quot; data-start=&quot;3770&quot;&gt;loadDataBtn.addEventListener('click', function() { fetch('&lt;a href=&quot;https://api.example.com/data')&quot;&gt;https://api.example.com/data')&lt;/a&gt; .then(response =&amp;gt; response.json()) .then(data =&amp;gt; { dataContainer.innerHTML = JSON.stringify(data); }) .catch(error =&amp;gt; console.error('데이터 로딩 오류:', error)); });&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;4026&quot; data-start=&quot;4023&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;4060&quot; data-start=&quot;4028&quot; data-ke-size=&quot;size23&quot;&gt;4. AJAX로 데이터를 가져오는 백엔드 구현 예시&lt;/h3&gt;
&lt;h4 data-end=&quot;4099&quot; data-start=&quot;4062&quot; data-ke-size=&quot;size20&quot;&gt;4.1. Controller (Spring Boot 예시)&lt;/h4&gt;
&lt;p data-end=&quot;4118&quot; data-start=&quot;4101&quot; data-ke-size=&quot;size16&quot;&gt;@RestController&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4253&quot; data-start=&quot;4119&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4146&quot; data-start=&quot;4119&quot;&gt;@RequestMapping(&quot;/api&quot;)&lt;/li&gt;
&lt;li data-end=&quot;4253&quot; data-start=&quot;4147&quot;&gt;@GetMapping(&quot;/data&quot;): 이 메서드는 /api/data 경로로 &lt;b&gt;GET 요청&lt;/b&gt;을 처리하고, 데이터베이스에서 데이터를 조회하여 &lt;b&gt;JSON 형식&lt;/b&gt;으로 응답합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;@RestController&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;@RequestMapping(&quot;/api&quot;)&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;DataController&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&lt;span&gt;@GetMapping(&quot;/data&quot;)&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ResponseEntity&amp;lt;List&amp;lt;Data&amp;gt;&amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;getData&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; List&amp;lt;Data&amp;gt; dataList = dataService.getAllData(); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;return&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ResponseEntity.ok(dataList); } } &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;4556&quot; data-start=&quot;4522&quot; data-ke-size=&quot;size20&quot;&gt;4.2. Service (Spring Boot 예시)&lt;/h4&gt;
&lt;p data-end=&quot;4568&quot; data-start=&quot;4558&quot; data-ke-size=&quot;size16&quot;&gt;@Service&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4622&quot; data-start=&quot;4569&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4622&quot; data-start=&quot;4569&quot;&gt;DataService: 이 클래스는 데이터를 가져오는 &lt;b&gt;비즈니스 로직&lt;/b&gt;을 처리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;@Service&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;DataService&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;@Autowired&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;private&lt;/span&gt;&lt;/span&gt;&lt;span&gt; DataRepository dataRepository; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span&gt; List&amp;lt;Data&amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;getAllData&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;{ &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;return&lt;/span&gt;&lt;/span&gt;&lt;span&gt; dataRepository.findAll(); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; } } &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;4856&quot; data-start=&quot;4819&quot; data-ke-size=&quot;size20&quot;&gt;4.3. Repository (Spring Boot 예시)&lt;/h4&gt;
&lt;p data-end=&quot;4871&quot; data-start=&quot;4858&quot; data-ke-size=&quot;size16&quot;&gt;@Repository&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4946&quot; data-start=&quot;4872&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4946&quot; data-start=&quot;4872&quot;&gt;DataRepository: 이 인터페이스는 &lt;b&gt;JPA Repository&lt;/b&gt;를 사용하여 데이터베이스에서 데이터를 조회합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;@Repository&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;interface&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;DataRepository&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;JpaRepository&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;Data, Long&amp;gt; { }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h3 data-end=&quot;48&quot; data-start=&quot;0&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;AJAX (Asynchronous JavaScript and XML)란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;165&quot; data-start=&quot;50&quot; data-ke-size=&quot;size16&quot;&gt;AJAX는 &lt;b&gt;비동기식&lt;/b&gt;으로 데이터를 서버와 주고받을 수 있는 기술입니다. 웹 페이지를 새로 고침하지 않고도 서버로부터 데이터를 요청하고, 받은 데이터를 동적으로 웹 페이지에 업데이트할 수 있게 해줍니다.&lt;/p&gt;
&lt;p data-end=&quot;344&quot; data-start=&quot;167&quot; data-ke-size=&quot;size16&quot;&gt;AJAX는 &lt;b&gt;JavaScript&lt;/b&gt;, &lt;b&gt;XMLHttpRequest&lt;/b&gt; 객체 또는 &lt;b&gt;Fetch API&lt;/b&gt;를 사용하여 클라이언트(브라우저)와 서버 간의 비동기적인 데이터 교환을 가능하게 만듭니다. 오늘날 &lt;b&gt;JSON&lt;/b&gt; 형식의 데이터가 많이 사용되며, &lt;b&gt;XML&lt;/b&gt; 대신 &lt;b&gt;JSON&lt;/b&gt;을 사용하는 경우가 많습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;365&quot; data-start=&quot;346&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;AJAX의 동작 방식&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;473&quot; data-start=&quot;366&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;395&quot; data-start=&quot;366&quot;&gt;**클라이언트(브라우저)**에서 데이터를 요청.&lt;/li&gt;
&lt;li data-end=&quot;424&quot; data-start=&quot;396&quot;&gt;&lt;b&gt;서버&lt;/b&gt;가 요청을 처리하고 데이터를 응답.&lt;/li&gt;
&lt;li data-end=&quot;473&quot; data-start=&quot;425&quot;&gt;&lt;b&gt;클라이언트&lt;/b&gt;는 응답 데이터를 받아 웹 페이지를 새로 고침하지 않고 업데이트.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-end=&quot;502&quot; data-start=&quot;475&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;AJAX를 사용하여 데이터 가져오기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;691&quot; data-start=&quot;504&quot; data-ke-size=&quot;size16&quot;&gt;AJAX에서 데이터를 가져오는 가장 기본적인 방법은 &lt;b&gt;XMLHttpRequest&lt;/b&gt; 객체 또는 &lt;b&gt;fetch&lt;/b&gt; API를 사용하는 것입니다. fetch API는 최신 자바스크립트에서 주로 사용되며, Promise를 지원합니다. 아래에서는 &lt;b&gt;fetch API&lt;/b&gt;를 사용한 예시를 통해 AJAX 동작을 설명하겠습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;716&quot; data-start=&quot;693&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;fetch API 사용법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;897&quot; data-start=&quot;718&quot; data-ke-size=&quot;size16&quot;&gt;**fetch**는 기본적으로 **Promise**를 반환합니다. Promise는 비동기 작업의 결과를 나타내는 객체로, 작업이 완료되면 처리 결과를 얻을 수 있도록 합니다. fetch는 &lt;b&gt;GET&lt;/b&gt;과 &lt;b&gt;POST&lt;/b&gt;와 같은 HTTP 요청을 보낼 수 있으며, 데이터 요청을 &lt;b&gt;비동기적으로&lt;/b&gt; 처리합니다.&lt;/p&gt;
&lt;h4 data-end=&quot;928&quot; data-start=&quot;899&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. fetch로 데이터 요청하기&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;fetch('&lt;a href=&quot;https://api.example.com/data')&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://api.example.com/data')&lt;/a&gt;&amp;nbsp;//&amp;nbsp;서버에&amp;nbsp;데이터를&amp;nbsp;요청&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(response&amp;nbsp;=&amp;gt;&amp;nbsp;response.json())&amp;nbsp;//&amp;nbsp;응답을&amp;nbsp;JSON&amp;nbsp;형태로&amp;nbsp;변환&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(data&amp;nbsp;=&amp;gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;변환된&amp;nbsp;데이터를&amp;nbsp;처리&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(data);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;데이터를&amp;nbsp;콘솔에&amp;nbsp;출력&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch(error&amp;nbsp;=&amp;gt;&amp;nbsp;console.error('Error:',&amp;nbsp;error));&amp;nbsp;//&amp;nbsp;오류&amp;nbsp;처리&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1252&quot; data-start=&quot;1239&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드 설명&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2127&quot; data-start=&quot;1254&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1452&quot; data-start=&quot;1254&quot;&gt;&lt;b&gt;fetch('&lt;a href=&quot;https://api.example.com/data')&quot;&gt;https://api.example.com/data')&lt;/a&gt;&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1452&quot; data-start=&quot;1306&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1395&quot; data-start=&quot;1306&quot;&gt;fetch() 함수는 URL을 인자로 받습니다. 여기서는 '&lt;a href=&quot;https://api.example.com/data'&quot;&gt;https://api.example.com/data'&lt;/a&gt;라는 URL로 GET 요청을 보냅니다.&lt;/li&gt;
&lt;li data-end=&quot;1452&quot; data-start=&quot;1400&quot;&gt;이 호출은 &lt;b&gt;비동기적&lt;/b&gt;으로 동작하므로, 서버로부터 응답이 오면 그때 결과를 처리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1732&quot; data-start=&quot;1454&quot;&gt;&lt;b&gt;.then(response =&amp;gt; response.json())&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1732&quot; data-start=&quot;1503&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1570&quot; data-start=&quot;1503&quot;&gt;fetch()는 Promise 객체를 반환합니다. 서버로부터 응답이 오면 then() 메서드가 호출됩니다.&lt;/li&gt;
&lt;li data-end=&quot;1657&quot; data-start=&quot;1575&quot;&gt;응답은 일반적으로 &lt;b&gt;Response 객체&lt;/b&gt;로 전달됩니다. 이를 &lt;b&gt;JSON 형식으로 변환&lt;/b&gt;하려면 .json() 메서드를 사용합니다.&lt;/li&gt;
&lt;li data-end=&quot;1732&quot; data-start=&quot;1662&quot;&gt;.json()은 &lt;b&gt;비동기&lt;/b&gt; 작업이므로 또 다른 Promise를 반환하고, 이를 .then()으로 처리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1930&quot; data-start=&quot;1734&quot;&gt;&lt;b&gt;.then(data =&amp;gt; {...})&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1930&quot; data-start=&quot;1769&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1856&quot; data-start=&quot;1769&quot;&gt;두 번째 then()은 .json()으로 변환된 데이터를 처리하는 함수입니다. 여기서 data는 서버로부터 받은 &lt;b&gt;JSON 데이터&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li data-end=&quot;1930&quot; data-start=&quot;1861&quot;&gt;data를 사용하여 필요한 동작을 할 수 있습니다. 예를 들어, 데이터를 HTML에 표시하는 등의 작업이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2127&quot; data-start=&quot;1932&quot;&gt;&lt;b&gt;.catch(error =&amp;gt; console.error('Error:', error))&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2127&quot; data-start=&quot;1994&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2080&quot; data-start=&quot;1994&quot;&gt;catch()는 &lt;b&gt;오류 처리&lt;/b&gt;를 담당합니다. 만약 요청 중에 오류가 발생하거나, fetch() 호출에서 문제가 생기면 이 구문이 실행됩니다.&lt;/li&gt;
&lt;li data-end=&quot;2127&quot; data-start=&quot;2085&quot;&gt;오류는 콘솔에 출력되며, 개발자는 이를 통해 문제를 해결할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;__&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-end=&quot;182&quot; data-start=&quot;166&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;기본 사용법&lt;/b&gt;:&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;fetch(url,&amp;nbsp;options)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(response&amp;nbsp;=&amp;gt;&amp;nbsp;response.json())&amp;nbsp;&amp;nbsp;//&amp;nbsp;응답을&amp;nbsp;JSON&amp;nbsp;형식으로&amp;nbsp;변환&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(data&amp;nbsp;=&amp;gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(data);&amp;nbsp;&amp;nbsp;//&amp;nbsp;데이터를&amp;nbsp;처리&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch(error&amp;nbsp;=&amp;gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.error('Error:',&amp;nbsp;error);&amp;nbsp;&amp;nbsp;//&amp;nbsp;오류&amp;nbsp;처리&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;536&quot; data-start=&quot;428&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;456&quot; data-start=&quot;428&quot;&gt;&lt;b&gt;url&lt;/b&gt;: 요청할 URL을 지정합니다.&lt;/li&gt;
&lt;li data-end=&quot;536&quot; data-start=&quot;457&quot;&gt;&lt;b&gt;options&lt;/b&gt;: 요청에 대한 선택적인 설정을 지정할 수 있습니다. (예: method, headers, body 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;541&quot; data-start=&quot;538&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;562&quot; data-start=&quot;543&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;fetch 예시들&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;587&quot; data-start=&quot;564&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 기본 GET 요청&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;653&quot; data-start=&quot;588&quot; data-ke-size=&quot;size16&quot;&gt;가장 간단한 GET 요청은 URL만 지정해주면 됩니다. 예를 들어, API 서버에서 데이터를 받아오는 코드입니다.&lt;/p&gt;
&lt;p data-end=&quot;653&quot; data-start=&quot;588&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;fetch('&lt;a href=&quot;https://api.example.com/data')&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://api.example.com/data')&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(response&amp;nbsp;=&amp;gt;&amp;nbsp;response.json())&amp;nbsp;&amp;nbsp;//&amp;nbsp;응답을&amp;nbsp;JSON으로&amp;nbsp;변환&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(data&amp;nbsp;=&amp;gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(data);&amp;nbsp;&amp;nbsp;//&amp;nbsp;데이터를&amp;nbsp;출력하거나&amp;nbsp;처리&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch(error&amp;nbsp;=&amp;gt;&amp;nbsp;console.error('Error:',&amp;nbsp;error));&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;972&quot; data-start=&quot;894&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;972&quot; data-start=&quot;894&quot;&gt;이 코드는 &lt;a href=&quot;https://api.example.com/data&quot;&gt;https://api.example.com/data&lt;/a&gt; URL에 GET 요청을 보내고, JSON 데이터를 받아와서 처리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;458&quot; data-start=&quot;432&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;실제 데이터가 어떻게 넘어오는지?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;557&quot; data-start=&quot;459&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, &lt;a href=&quot;https://api.example.com/data&quot;&gt;https://api.example.com/data&lt;/a&gt;에서 데이터를 &lt;b&gt;GET&lt;/b&gt;으로 요청할 때 서버가 응답하는 JSON 형식의 데이터는 다음과 같을 수 있습니다:&lt;/p&gt;
&lt;h4 data-end=&quot;588&quot; data-start=&quot;559&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;서버 응답 데이터 예시 (JSON)&lt;/b&gt;:&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;status&quot;:&amp;nbsp;&quot;success&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;data&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;username&quot;:&amp;nbsp;&quot;exampleUser&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;email&quot;:&amp;nbsp;&quot;user@example.com&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;977&quot; data-start=&quot;974&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1013&quot; data-start=&quot;979&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. POST 요청 (서버로 데이터 전송)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1072&quot; data-start=&quot;1014&quot; data-ke-size=&quot;size16&quot;&gt;서버로 데이터를 전송하려면, POST 메서드를 사용합니다. 데이터는 **body**로 전송됩니다.&lt;/p&gt;
&lt;p data-end=&quot;1072&quot; data-start=&quot;1014&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;fetch('&lt;a href=&quot;https://api.example.com/submit',&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://api.example.com/submit',&lt;/a&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method:&amp;nbsp;'POST',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Content-Type':&amp;nbsp;'application/json'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body:&amp;nbsp;JSON.stringify({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;username:&amp;nbsp;'exampleUser',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;password:&amp;nbsp;'examplePass'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(response&amp;nbsp;=&amp;gt;&amp;nbsp;response.json())&amp;nbsp;&amp;nbsp;//&amp;nbsp;응답을&amp;nbsp;JSON으로&amp;nbsp;변환&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(data&amp;nbsp;=&amp;gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(data);&amp;nbsp;&amp;nbsp;//&amp;nbsp;서버에서&amp;nbsp;받은&amp;nbsp;데이터&amp;nbsp;처리&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch(error =&amp;gt; console.error('Error:', error));&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1697&quot; data-start=&quot;1505&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1546&quot; data-start=&quot;1505&quot;&gt;method: 'POST': HTTP 메서드를 POST로 설정.&lt;/li&gt;
&lt;li data-end=&quot;1633&quot; data-start=&quot;1547&quot;&gt;headers: 요청의 헤더를 설정. 여기서 Content-Type: application/json은 요청 본문이 JSON 형식임을 나타냅니다.&lt;/li&gt;
&lt;li data-end=&quot;1697&quot; data-start=&quot;1634&quot;&gt;body: 서버로 보내는 데이터. JSON.stringify()로 객체를 문자열로 변환하여 전송합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1565&quot; data-start=&quot;1522&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;실제 데이터가 POST로 넘어가는 방식 (HTML 폼과 데이터)&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;1604&quot; data-start=&quot;1567&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;HTML 폼 예시 (POST 요청으로 데이터 전송)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;form&amp;nbsp;id=&quot;loginForm&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input&amp;nbsp;type=&quot;text&quot;&amp;nbsp;id=&quot;username&quot;&amp;nbsp;name=&quot;username&quot;&amp;nbsp;placeholder=&quot;사용자&amp;nbsp;이름&quot;&amp;nbsp;required&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input&amp;nbsp;type=&quot;password&quot;&amp;nbsp;id=&quot;password&quot;&amp;nbsp;name=&quot;password&quot;&amp;nbsp;placeholder=&quot;비밀번호&quot;&amp;nbsp;required&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;button&amp;nbsp;type=&quot;submit&quot;&amp;gt;로그인&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-end=&quot;1898&quot; data-start=&quot;1857&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;자바스크립트로 POST 요청을 보내는 예시 (폼 제출 시)&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;const&amp;nbsp;form&amp;nbsp;=&amp;nbsp;document.getElementById('loginForm');&lt;br /&gt;form.addEventListener('submit',&amp;nbsp;function(event)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;event.preventDefault();&amp;nbsp;&amp;nbsp;//&amp;nbsp;폼&amp;nbsp;제출을&amp;nbsp;막고,&amp;nbsp;자바스크립트로&amp;nbsp;데이터를&amp;nbsp;전송&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;username&amp;nbsp;=&amp;nbsp;document.getElementById('username').value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;password&amp;nbsp;=&amp;nbsp;document.getElementById('password').value;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fetch('&lt;a href=&quot;https://api.example.com/submit',&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://api.example.com/submit',&lt;/a&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method:&amp;nbsp;'POST',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Content-Type':&amp;nbsp;'application/json'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body:&amp;nbsp;JSON.stringify({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;username:&amp;nbsp;username,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;password:&amp;nbsp;password&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(response&amp;nbsp;=&amp;gt;&amp;nbsp;response.json())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(data&amp;nbsp;=&amp;gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(data);&amp;nbsp;&amp;nbsp;//&amp;nbsp;서버에서&amp;nbsp;받은&amp;nbsp;응답&amp;nbsp;처리&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch(error&amp;nbsp;=&amp;gt;&amp;nbsp;console.error('Error:',&amp;nbsp;error));&lt;br /&gt;});&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2663&quot; data-start=&quot;2634&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;실제 데이터가 POST로 넘어가는 방식&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2687&quot; data-start=&quot;2665&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTML에서 전송된 데이터 예시&lt;/b&gt;:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2845&quot; data-start=&quot;2688&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2760&quot; data-start=&quot;2688&quot;&gt;사용자가 &lt;b&gt;username&lt;/b&gt;에 exampleUser, &lt;b&gt;password&lt;/b&gt;에 examplePass를 입력합니다.&lt;/li&gt;
&lt;li data-end=&quot;2845&quot; data-start=&quot;2761&quot;&gt;**fetch()**로 서버로 요청을 보낼 때 **JSON.stringify()**를 사용하여 데이터는 다음과 같은 형태로 서버로 전송됩니다:&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;username&quot;:&amp;nbsp;&quot;exampleUser&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;password&quot;:&amp;nbsp;&quot;examplePass&quot;&lt;br /&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2965&quot; data-start=&quot;2925&quot; data-ke-size=&quot;size16&quot;&gt;서버에서는 이 데이터를 받아 로그인 절차를 처리하고, 응답을 반환합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;3005&quot; data-start=&quot;2967&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;서버 응답 데이터 예시 (POST 요청에 대한 응답)&lt;/b&gt;:&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;status&quot;:&amp;nbsp;&quot;success&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;message&quot;:&amp;nbsp;&quot;로그인&amp;nbsp;성공!&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;userData&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;username&quot;:&amp;nbsp;&quot;exampleUser&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;email&quot;:&amp;nbsp;&quot;user@example.com&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1702&quot; data-start=&quot;1699&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1736&quot; data-start=&quot;1704&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. GET 요청에 쿼리 매개변수 추가&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1786&quot; data-start=&quot;1737&quot; data-ke-size=&quot;size16&quot;&gt;GET 요청에 URL 뒤에 쿼리 문자열을 추가하여 특정 데이터를 요청할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;1786&quot; data-start=&quot;1737&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;fetch('&lt;a href=&quot;https://api.example.com/data?search=apple&amp;amp;limit=10')&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://api.example.com/data?search=apple&amp;amp;limit=10')&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(response&amp;nbsp;=&amp;gt;&amp;nbsp;response.json())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(data&amp;nbsp;=&amp;gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(data);&amp;nbsp;&amp;nbsp;//&amp;nbsp;검색&amp;nbsp;결과&amp;nbsp;데이터&amp;nbsp;처리&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch(error&amp;nbsp;=&amp;gt;&amp;nbsp;console.error('Error:',&amp;nbsp;error));&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2094&quot; data-start=&quot;2030&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2094&quot; data-start=&quot;2030&quot;&gt;?search=apple&amp;amp;limit=10: 쿼리 문자열을 URL에 추가하여 서버에 특정 조건으로 요청합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2099&quot; data-start=&quot;2096&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;2148&quot; data-start=&quot;2101&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. POST 요청에서 FormData 사용 (파일 업로드 포함)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2239&quot; data-start=&quot;2149&quot; data-ke-size=&quot;size16&quot;&gt;파일 업로드와 같은 데이터를 POST 요청으로 전송할 때, FormData 객체를 사용합니다. 이를 통해 파일을 포함한 데이터를 서버에 보낼 수 있습니다.&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2757&quot; data-start=&quot;2633&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2693&quot; data-start=&quot;2633&quot;&gt;const&amp;nbsp;formData&amp;nbsp;=&amp;nbsp;new&amp;nbsp;FormData();&lt;br /&gt;formData.append('file',&amp;nbsp;document.getElementById('fileInput').files[0]);&lt;br /&gt;&lt;br /&gt;fetch('&lt;a href=&quot;https://api.example.com/upload',&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://api.example.com/upload',&lt;/a&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method:&amp;nbsp;'POST',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body:&amp;nbsp;formData&amp;nbsp;&amp;nbsp;//&amp;nbsp;FormData를&amp;nbsp;body로&amp;nbsp;전송&lt;br /&gt;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(response&amp;nbsp;=&amp;gt;&amp;nbsp;response.json())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(data&amp;nbsp;=&amp;gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(data);&amp;nbsp;&amp;nbsp;//&amp;nbsp;업로드&amp;nbsp;결과&amp;nbsp;처리&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch(error&amp;nbsp;=&amp;gt;&amp;nbsp;console.error('Error:',&amp;nbsp;error));&lt;br /&gt;FormData.append('file', file)은 파일을 FormData 객체에 추가합니다.&lt;/li&gt;
&lt;li data-end=&quot;2757&quot; data-start=&quot;2694&quot;&gt;body: formData: fetch에 FormData 객체를 전송하여 파일 업로드를 처리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2762&quot; data-start=&quot;2759&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;2795&quot; data-start=&quot;2764&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. PUT 요청 (리소스 업데이트)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2835&quot; data-start=&quot;2796&quot; data-ke-size=&quot;size16&quot;&gt;서버에서 기존 데이터를 업데이트할 때는 PUT 메서드를 사용합니다.&lt;/p&gt;
&lt;p data-end=&quot;2835&quot; data-start=&quot;2796&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;fetch('&lt;a href=&quot;https://api.example.com/updateData',&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://api.example.com/updateData',&lt;/a&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method:&amp;nbsp;'PUT',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Content-Type':&amp;nbsp;'application/json'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body:&amp;nbsp;JSON.stringify({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;'Updated&amp;nbsp;Name'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(response&amp;nbsp;=&amp;gt;&amp;nbsp;response.json())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(data&amp;nbsp;=&amp;gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(data);&amp;nbsp;&amp;nbsp;//&amp;nbsp;업데이트된&amp;nbsp;데이터&amp;nbsp;처리&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch(error&amp;nbsp;=&amp;gt;&amp;nbsp;console.error('Error:',&amp;nbsp;error));&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3321&quot; data-start=&quot;3230&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3270&quot; data-start=&quot;3230&quot;&gt;method: 'PUT': HTTP 메서드를 PUT으로 설정.&lt;/li&gt;
&lt;li data-end=&quot;3321&quot; data-start=&quot;3271&quot;&gt;body: 수정할 데이터를 JSON.stringify()로 변환하여 전송합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3326&quot; data-start=&quot;3323&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;3360&quot; data-start=&quot;3328&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6. DELETE 요청 (리소스 삭제)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;3398&quot; data-start=&quot;3361&quot; data-ke-size=&quot;size16&quot;&gt;서버에서 데이터를 삭제할 때는 DELETE 메서드를 사용합니다.&lt;/p&gt;
&lt;p data-end=&quot;3398&quot; data-start=&quot;3361&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;fetch('&lt;a href=&quot;https://api.example.com/updateData',&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://api.example.com/updateData',&lt;/a&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method:&amp;nbsp;'PUT',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Content-Type':&amp;nbsp;'application/json'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body:&amp;nbsp;JSON.stringify({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;'Updated&amp;nbsp;Name'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(response&amp;nbsp;=&amp;gt;&amp;nbsp;response.json())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(data&amp;nbsp;=&amp;gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(data);&amp;nbsp;&amp;nbsp;//&amp;nbsp;업데이트된&amp;nbsp;데이터&amp;nbsp;처리&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch(error&amp;nbsp;=&amp;gt;&amp;nbsp;console.error('Error:',&amp;nbsp;error));&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3723&quot; data-start=&quot;3650&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3695&quot; data-start=&quot;3650&quot;&gt;method: 'DELETE': HTTP 메서드를 DELETE로 설정.&lt;/li&gt;
&lt;li data-end=&quot;3723&quot; data-start=&quot;3696&quot;&gt;URL에 삭제할 리소스를 지정하여 요청합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3728&quot; data-start=&quot;3725&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;3769&quot; data-start=&quot;3730&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7. fetch와 async/await 사용하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;3891&quot; data-start=&quot;3770&quot; data-ke-size=&quot;size16&quot;&gt;async/await 문법을 사용하면 비동기 코드를 더 깔끔하고 읽기 쉽게 작성할 수 있습니다. fetch를 await와 함께 사용하면, then()을 체이닝하지 않고도 결과를 쉽게 처리할 수 있습니다.&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4297&quot; data-start=&quot;4176&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4258&quot; data-start=&quot;4176&quot;&gt;async&amp;nbsp;function&amp;nbsp;fetchData()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;response&amp;nbsp;=&amp;nbsp;await&amp;nbsp;fetch('&lt;a href=&quot;https://api.example.com/data');&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://api.example.com/data');&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;data&amp;nbsp;=&amp;nbsp;await&amp;nbsp;response.json();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(error)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.error('Error:',&amp;nbsp;error);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;fetchData();&lt;br /&gt;await는 fetch가 반환하는 Promise가 해결될 때까지 기다리고, response.json()도 비동기적으로 처리됩니다.&lt;/li&gt;
&lt;li data-end=&quot;4297&quot; data-start=&quot;4259&quot;&gt;try/catch 블록을 사용하여 오류를 처리할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>개발 이론/WEB</category>
      <category>js</category>
      <author>jeonghoe21</author>
      <guid isPermaLink="true">https://jeonghoe21.tistory.com/31</guid>
      <comments>https://jeonghoe21.tistory.com/31#entry31comment</comments>
      <pubDate>Wed, 19 Mar 2025 23:47:12 +0900</pubDate>
    </item>
    <item>
      <title>SQL(기초)</title>
      <link>https://jeonghoe21.tistory.com/30</link>
      <description>&lt;h3 data-end=&quot;206&quot; data-start=&quot;153&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  1. DDL (Data Definition Language) - 데이터 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;249&quot; data-start=&quot;207&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;테이블, 인덱스, 뷰 등을 생성, 수정, 삭제하는 SQL 문법&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;631&quot; data-start=&quot;251&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  (1) 기초 - 테이블 생성 및 삭제&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;테이블 생성 (CREATE TABLE)&lt;/b&gt;&lt;br /&gt;CREATE TABLE users (&lt;br /&gt;id INT IDENTITY(1,1) PRIMARY KEY, -- 자동 증가 기본 키&lt;br /&gt;username VARCHAR(50) NOT NULL UNIQUE, -- 사용자 이름 (유일성 제약)&lt;br /&gt;email VARCHAR(100) NOT NULL UNIQUE, -- 이메일 (유일성 제약)&lt;br /&gt;password VARCHAR(255) NOT NULL, -- 비밀번호&lt;br /&gt;created_at DATETIME DEFAULT CURRENT_TIMESTAMP -- 생성 시간 자동 입력&lt;br /&gt;);&lt;/p&gt;
&lt;p data-end=&quot;680&quot; data-start=&quot;633&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;테이블 삭제 (DROP TABLE)&lt;/b&gt;&lt;br /&gt;DROP TABLE users;&lt;/p&gt;
&lt;hr data-end=&quot;685&quot; data-start=&quot;682&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;802&quot; data-start=&quot;687&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  (2) 응용 - 테이블 변경 및 제약 조건 추가&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;기존 테이블에 컬럼 추가 (ALTER TABLE)&lt;/b&gt;&lt;br /&gt;ALTER TABLE users ADD age INT DEFAULT 20;&lt;/p&gt;
&lt;p data-end=&quot;871&quot; data-start=&quot;804&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;컬럼 이름 변경&lt;/b&gt;&lt;br /&gt;ALTER TABLE users RENAME COLUMN age TO user_age;&lt;/p&gt;
&lt;p data-end=&quot;945&quot; data-start=&quot;873&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;컬럼 데이터 타입 변경&lt;/b&gt;&lt;br /&gt;ALTER TABLE users ALTER COLUMN user_age SMALLINT;&lt;/p&gt;
&lt;p data-end=&quot;1002&quot; data-start=&quot;947&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;컬럼 삭제&lt;/b&gt;&lt;br /&gt;ALTER TABLE users DROP COLUMN user_age;&lt;/p&gt;
&lt;hr data-end=&quot;1007&quot; data-start=&quot;1004&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1112&quot; data-start=&quot;1009&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  (3) 고급 - 인덱스 및 뷰&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;인덱스 생성 (CREATE INDEX)&lt;/b&gt;&lt;br /&gt;CREATE INDEX idx_username ON users(username);&lt;/p&gt;
&lt;p data-end=&quot;1208&quot; data-start=&quot;1114&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;뷰 생성 (CREATE VIEW)&lt;/b&gt;&lt;br /&gt;CREATE VIEW user_info AS&lt;br /&gt;SELECT id, username, email FROM users;&lt;/p&gt;
&lt;hr data-end=&quot;1213&quot; data-start=&quot;1210&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1270&quot; data-start=&quot;1215&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  2. DML (Data Manipulation Language) - 데이터 조작&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1339&quot; data-start=&quot;1271&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;데이터를 조회(SELECT), 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)하는 SQL 문법&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1540&quot; data-start=&quot;1341&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  (1) 기초 - 기본적인 CRUD (Create, Read, Update, Delete)&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;데이터 삽입 (INSERT INTO)&lt;/b&gt;&lt;br /&gt;INSERT INTO users (username, email, password)&lt;br /&gt;VALUES ('john_doe', '&lt;a data-end=&quot;1514&quot; data-start=&quot;1498&quot;&gt;john@example.com&lt;/a&gt;', 'hashedpassword123');&lt;/p&gt;
&lt;p data-end=&quot;1588&quot; data-start=&quot;1542&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;데이터 조회 (SELECT)&lt;/b&gt;&lt;br /&gt;SELECT * FROM users;&lt;/p&gt;
&lt;p data-end=&quot;1696&quot; data-start=&quot;1590&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;데이터 수정 (UPDATE)&lt;/b&gt;&lt;br /&gt;UPDATE users&lt;br /&gt;SET password = 'newhashedpassword'&lt;br /&gt;WHERE username = 'john_doe';&lt;/p&gt;
&lt;p data-end=&quot;1770&quot; data-start=&quot;1698&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;데이터 삭제 (DELETE)&lt;/b&gt;&lt;br /&gt;DELETE FROM users WHERE username = 'john_doe';&lt;/p&gt;
&lt;hr data-end=&quot;1775&quot; data-start=&quot;1772&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1892&quot; data-start=&quot;1777&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  (2) 응용 - WHERE, JOIN, GROUP BY&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;조건 조회 (WHERE)&lt;/b&gt;&lt;br /&gt;SELECT * FROM users WHERE email LIKE '%@gmail.com';&lt;/p&gt;
&lt;p data-end=&quot;2013&quot; data-start=&quot;1894&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;조인 (JOIN)&lt;/b&gt;&lt;br /&gt;SELECT users.username, orders.amount&lt;br /&gt;FROM users&lt;br /&gt;INNER JOIN orders ON users.id = orders.user_id;&lt;/p&gt;
&lt;p data-end=&quot;2110&quot; data-start=&quot;2015&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;그룹화 및 집계 (GROUP BY)&lt;/b&gt;&lt;br /&gt;SELECT role, COUNT(*) as user_count&lt;br /&gt;FROM users&lt;br /&gt;GROUP BY role;&lt;/p&gt;
&lt;hr data-end=&quot;2115&quot; data-start=&quot;2112&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;2270&quot; data-start=&quot;2117&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  (3) 고급 - 서브쿼리, 윈도우 함수&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;서브쿼리 (Subquery)&lt;/b&gt;&lt;br /&gt;SELECT username, email FROM users&lt;br /&gt;WHERE id IN (SELECT user_id FROM orders WHERE amount &amp;gt; 100);&lt;/p&gt;
&lt;p data-end=&quot;2421&quot; data-start=&quot;2272&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;윈도우 함수 (RANK, ROW_NUMBER)&lt;/b&gt;&lt;br /&gt;SELECT username, role,&lt;br /&gt;RANK() OVER (PARTITION BY role ORDER BY created_at DESC) AS ranking&lt;br /&gt;FROM users;&lt;/p&gt;
&lt;hr data-end=&quot;2426&quot; data-start=&quot;2423&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2477&quot; data-start=&quot;2428&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  3. DCL (Data Control Language) - 권한 관리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2512&quot; data-start=&quot;2478&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;데이터베이스 사용자 권한을 관리하는 SQL 문법&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2600&quot; data-start=&quot;2514&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  (1) 기본적인 권한 부여 (GRANT)&lt;/b&gt;&lt;br /&gt;GRANT SELECT, INSERT ON users TO 'john'@'localhost';&lt;/p&gt;
&lt;p data-end=&quot;2679&quot; data-start=&quot;2602&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  (2) 권한 회수 (REVOKE)&lt;/b&gt;&lt;br /&gt;REVOKE INSERT ON users FROM 'john'@'localhost';&lt;/p&gt;
&lt;hr data-end=&quot;2684&quot; data-start=&quot;2681&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2744&quot; data-start=&quot;2686&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  4. TCL (Transaction Control Language) - 트랜잭션 관리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2781&quot; data-start=&quot;2745&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;트랜잭션 단위로 데이터 변경을 관리하는 SQL 문법&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2911&quot; data-start=&quot;2783&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  (1) 트랜잭션 시작 및 커밋 (COMMIT)&lt;/b&gt;&lt;br /&gt;BEGIN TRANSACTION;&lt;br /&gt;UPDATE users SET role = 'ADMIN' WHERE username = 'john_doe';&lt;br /&gt;COMMIT;&lt;/p&gt;
&lt;p data-end=&quot;3021&quot; data-start=&quot;2913&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  (2) 롤백 (ROLLBACK)&lt;/b&gt;&lt;br /&gt;BEGIN TRANSACTION;&lt;br /&gt;DELETE FROM users WHERE username = 'john_doe';&lt;br /&gt;ROLLBACK;&lt;/p&gt;
&lt;p data-end=&quot;3170&quot; data-start=&quot;3023&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  (3) 저장점 (SAVEPOINT)&lt;/b&gt;&lt;br /&gt;SAVEPOINT before_update;&lt;br /&gt;UPDATE users SET role = 'ADMIN' WHERE username = 'john_doe';&lt;br /&gt;ROLLBACK TO before_update;&lt;/p&gt;</description>
      <category>개발 이론/DB</category>
      <category>SQL</category>
      <author>jeonghoe21</author>
      <guid isPermaLink="true">https://jeonghoe21.tistory.com/30</guid>
      <comments>https://jeonghoe21.tistory.com/30#entry30comment</comments>
      <pubDate>Wed, 19 Mar 2025 22:33:03 +0900</pubDate>
    </item>
    <item>
      <title>SSR</title>
      <link>https://jeonghoe21.tistory.com/29</link>
      <description>&lt;h1 data-end=&quot;60&quot; data-start=&quot;0&quot;&gt;&lt;b&gt;Spring Boot에서 서버 사이드 렌더링 (SSR) 구현 - JSP &amp;amp; Thymeleaf&lt;/b&gt;&lt;/h1&gt;
&lt;hr data-end=&quot;64&quot; data-start=&quot;61&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;97&quot; data-start=&quot;66&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  1. 서버 사이드 렌더링(SSR)이란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;184&quot; data-start=&quot;98&quot; data-ke-size=&quot;size16&quot;&gt;서버 사이드 렌더링(SSR, &lt;b&gt;Server-Side Rendering&lt;/b&gt;)은 &lt;b&gt;서버에서 HTML을 렌더링하여 클라이언트에게 전송하는 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;363&quot; data-start=&quot;185&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;223&quot; data-start=&quot;185&quot;&gt;✅ &lt;b&gt;클라이언트가 요청하면 서버에서 HTML을 생성하여 응답&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;268&quot; data-start=&quot;224&quot;&gt;✅ &lt;b&gt;초기 로딩 속도가 빠름 (HTML이 완전히 렌더링된 상태로 전달)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;323&quot; data-start=&quot;269&quot;&gt;✅ &lt;b&gt;SEO(Search Engine Optimization, 검색 엔진 최적화)에 유리&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;360&quot; data-start=&quot;324&quot;&gt;✅ &lt;b&gt;JavaScript 없이도 페이지가 정상적으로 보임&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;412&quot; data-start=&quot;364&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;Spring Boot에서는 SSR을 지원하는 두 가지 대표적인 템플릿 엔진&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;460&quot; data-start=&quot;413&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;443&quot; data-start=&quot;413&quot;&gt;&lt;b&gt;JSP (Java Server Pages)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;460&quot; data-start=&quot;444&quot;&gt;&lt;b&gt;Thymeleaf&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;465&quot; data-start=&quot;462&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;492&quot; data-start=&quot;467&quot;&gt;&lt;b&gt;  2. JSP 기반 SSR 구현&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;557&quot; data-start=&quot;493&quot; data-ke-size=&quot;size16&quot;&gt;JSP는 Java 코드와 HTML을 함께 사용할 수 있는 템플릿 엔진으로, &lt;b&gt;Servlet과 함께 동작&lt;/b&gt;합니다.&lt;/p&gt;
&lt;hr data-end=&quot;562&quot; data-start=&quot;559&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;606&quot; data-start=&quot;564&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  1️⃣ JSP를 사용한 Spring Boot 프로젝트 설정&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;669&quot; data-start=&quot;607&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  spring-boot-starter-web과 tomcat-embed-jasper 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;682&quot; data-start=&quot;670&quot; data-ke-size=&quot;size16&quot;&gt;  pom.xml&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--&amp;nbsp;Spring&amp;nbsp;Boot&amp;nbsp;Web&amp;nbsp;--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--&amp;nbsp;JSP를&amp;nbsp;사용하기&amp;nbsp;위한&amp;nbsp;Jasper&amp;nbsp;라이브러리&amp;nbsp;추가&amp;nbsp;--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;org.apache.tomcat.embed&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;tomcat-embed-jasper&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--&amp;nbsp;JSTL&amp;nbsp;(JSP에서&amp;nbsp;반복문,&amp;nbsp;조건문&amp;nbsp;등을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;지원)&amp;nbsp;--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;/dependencies&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1356&quot; data-start=&quot;1246&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;tomcat-embed-jasper가 있어야 Spring Boot에서 JSP를 사용할 수 있음&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;JSTL은 JSP에서 &amp;lt;c:forEach&amp;gt; 등의 문법을 사용할 때 필요&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1361&quot; data-start=&quot;1358&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1404&quot; data-start=&quot;1363&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  2️⃣ application.properties 설정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1451&quot; data-start=&quot;1405&quot; data-ke-size=&quot;size16&quot;&gt;  src/main/resources/application.properties&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;spring.mvc.view.prefix=/WEB-INF/views/&lt;br /&gt;spring.mvc.view.suffix=.jsp&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1618&quot; data-start=&quot;1537&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;JSP 파일은 /WEB-INF/views/ 디렉토리에 위치해야 함&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;.jsp 파일 확장자를 자동으로 인식하도록 설정&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1623&quot; data-start=&quot;1620&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1653&quot; data-start=&quot;1625&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  3️⃣ JSP 기반 컨트롤러 구현&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;1683&quot; data-start=&quot;1654&quot; data-ke-size=&quot;size23&quot;&gt;  BoardController.java&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;package&amp;nbsp;co&lt;a href=&quot;http://m.example.board.controller;&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.example.board.controller;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;co&lt;a href=&quot;http://m.example.board.model.Post;&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.example.board.model.Post;&lt;/a&gt;&lt;br /&gt;import&amp;nbsp;co&lt;a href=&quot;http://m.example.board.service.PostService;&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.example.board.service.PostService;&lt;/a&gt;&lt;br /&gt;import&amp;nbsp;lombok.RequiredArgsConstructor;&lt;br /&gt;import&amp;nbsp;org.springframework.stereotype.Controller;&lt;br /&gt;import&amp;nbsp;org.springframework.ui.Model;&lt;br /&gt;import&amp;nbsp;org.springframework.web.bind.annotation.GetMapping;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;java.util.List;&lt;br /&gt;&lt;br /&gt;@Controller&amp;nbsp;//&amp;nbsp; &amp;nbsp;JSP를&amp;nbsp;사용할&amp;nbsp;경우&amp;nbsp;@RestController가&amp;nbsp;아닌&amp;nbsp;@Controller&amp;nbsp;사용&lt;br /&gt;@RequiredArgsConstructor&lt;br /&gt;public&amp;nbsp;class&amp;nbsp;BoardController&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;final&amp;nbsp;PostService&amp;nbsp;postService;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp; &amp;nbsp;게시글&amp;nbsp;목록&amp;nbsp;페이지&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@GetMapping(&quot;/board&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;boardPage(Model&amp;nbsp;model)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;Post&amp;gt;&amp;nbsp;posts&amp;nbsp;=&amp;nbsp;postService.getAllPosts();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;model.addAttribute(&quot;posts&quot;,&amp;nbsp;posts);&amp;nbsp;//&amp;nbsp; &amp;nbsp;JSP에서&amp;nbsp;사용할&amp;nbsp;데이터&amp;nbsp;추가&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&quot;board&quot;;&amp;nbsp;//&amp;nbsp; &amp;nbsp;board.jsp로&amp;nbsp;이동&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2608&quot; data-start=&quot;2456&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;JSP 사용 시 @RestController가 아닌 @Controller 사용&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;Model 객체를 사용하여 데이터를 JSP 파일에 전달&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;return &quot;board&quot;; &amp;rarr; WEB-INF/views/board.jsp를 찾음&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;2613&quot; data-start=&quot;2610&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2638&quot; data-start=&quot;2615&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  4️⃣ JSP 파일 작성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2683&quot; data-start=&quot;2639&quot; data-ke-size=&quot;size16&quot;&gt;  src/main/webapp/WEB-INF/views/board.jsp&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;lt;%@&amp;nbsp;page&amp;nbsp;contentType=&quot;text/html;&amp;nbsp;charset=UTF-8&quot;&amp;nbsp;language=&quot;java&quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;uri=&quot;&lt;a href=&quot;http://java.sun.com/jsp/jstl/core&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://java.sun.com/jsp/jstl/core&lt;/a&gt;&quot;&amp;nbsp;prefix=&quot;c&quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;게시판&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;게시판&amp;nbsp;목록&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;table&amp;nbsp;border=&quot;1&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th&amp;gt;내용&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;c:forEach&amp;nbsp;var=&quot;post&quot;&amp;nbsp;items=&quot;${posts}&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;${post.id}&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;${post.title}&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;${post.content}&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/c:forEach&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3282&quot; data-start=&quot;3270&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;JSP 문법&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3521&quot; data-start=&quot;3283&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3354&quot; data-start=&quot;3283&quot;&gt;&amp;lt;%@ page contentType=&quot;text/html; charset=UTF-8&quot; %&amp;gt; &amp;rarr; &lt;b&gt;페이지 인코딩 설정&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3446&quot; data-start=&quot;3355&quot;&gt;&amp;lt;%@ taglib uri=&quot;&lt;a href=&quot;http://java.sun.com/jsp/jstl/core&quot;&gt;http://java.sun.com/jsp/jstl/core&lt;/a&gt;&quot; prefix=&quot;c&quot; %&amp;gt; &amp;rarr; &lt;b&gt;JSTL 태그 라이브러리 추가&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3521&quot; data-start=&quot;3447&quot;&gt;&amp;lt;c:forEach var=&quot;post&quot; items=&quot;${posts}&quot;&amp;gt; &amp;rarr; &lt;b&gt;posts 리스트를 반복하며 데이터 출력&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3526&quot; data-start=&quot;3523&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3551&quot; data-start=&quot;3528&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  5️⃣ JSP 실행 결과&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3663&quot; data-start=&quot;3552&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;URL: http://localhost:8080/board로 접속하면 JSP 페이지에서 게시글이 렌더링됨&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;Spring Boot에서 서버 사이드 렌더링을 JSP로 구현 완료&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;3668&quot; data-start=&quot;3665&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3701&quot; data-start=&quot;3670&quot;&gt;&lt;b&gt;  3. Thymeleaf 기반 SSR 구현&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;3861&quot; data-start=&quot;3702&quot; data-ke-size=&quot;size16&quot;&gt;Thymeleaf는 &lt;b&gt;JSP보다 더 현대적이고 강력한 템플릿 엔진&lt;/b&gt;입니다.&lt;br /&gt;✅ &lt;b&gt;Spring Boot와 완벽하게 통합 가능&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;HTML 파일에서 직접 Thymeleaf 문법 사용 가능&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;JSP와 다르게 @RestController에서도 사용 가능&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;3866&quot; data-start=&quot;3863&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3903&quot; data-start=&quot;3868&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  1️⃣ Thymeleaf를 사용하기 위한 설정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3916&quot; data-start=&quot;3904&quot; data-ke-size=&quot;size16&quot;&gt;  pom.xml&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--&amp;nbsp;Spring&amp;nbsp;Boot&amp;nbsp;Web&amp;nbsp;--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--&amp;nbsp;Thymeleaf&amp;nbsp;템플릿&amp;nbsp;엔진&amp;nbsp;--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;spring-boot-starter-thymeleaf&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;/dependencies&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4380&quot; data-start=&quot;4313&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;Spring Boot에서는 spring-boot-starter-thymeleaf만 추가하면 자동 설정됨&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;4385&quot; data-start=&quot;4382&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4428&quot; data-start=&quot;4387&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  2️⃣ application.properties 설정&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;spring.thymeleaf.prefix=classpath:/templates/&lt;br /&gt;spring.thymeleaf.suffix=.html&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4614&quot; data-start=&quot;4523&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;Thymeleaf 템플릿 파일을 src/main/resources/templates/에서 찾도록 설정&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;.html 확장자로 자동 인식&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;4619&quot; data-start=&quot;4616&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4655&quot; data-start=&quot;4621&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  3️⃣ Thymeleaf 기반 컨트롤러 구현&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;4685&quot; data-start=&quot;4656&quot; data-ke-size=&quot;size23&quot;&gt;  BoardController.java&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;package&amp;nbsp;co&lt;a href=&quot;http://m.example.board.controller;&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.example.board.controller;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;co&lt;a href=&quot;http://m.example.board.model.Post;&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.example.board.model.Post;&lt;/a&gt;&lt;br /&gt;import&amp;nbsp;co&lt;a href=&quot;http://m.example.board.service.PostService;&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.example.board.service.PostService;&lt;/a&gt;&lt;br /&gt;import&amp;nbsp;lombok.RequiredArgsConstructor;&lt;br /&gt;import&amp;nbsp;org.springframework.stereotype.Controller;&lt;br /&gt;import&amp;nbsp;org.springframework.ui.Model;&lt;br /&gt;import&amp;nbsp;org.springframework.web.bind.annotation.GetMapping;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;java.util.List;&lt;br /&gt;&lt;br /&gt;@Controller&amp;nbsp;//&amp;nbsp; &amp;nbsp;Thymeleaf를&amp;nbsp;사용할&amp;nbsp;경우&amp;nbsp;@RestController가&amp;nbsp;아닌&amp;nbsp;@Controller&amp;nbsp;사용&lt;br /&gt;@RequiredArgsConstructor&lt;br /&gt;public&amp;nbsp;class&amp;nbsp;BoardController&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;final&amp;nbsp;PostService&amp;nbsp;postService;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@GetMapping(&quot;/board&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;boardPage(Model&amp;nbsp;model)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;Post&amp;gt;&amp;nbsp;posts&amp;nbsp;=&amp;nbsp;postService.getAllPosts();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;model.addAttribute(&quot;posts&quot;,&amp;nbsp;posts);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&quot;board&quot;;&amp;nbsp;//&amp;nbsp; &amp;nbsp;board.html을&amp;nbsp;반환&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;5546&quot; data-start=&quot;5421&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;JSP와 동일한 방식으로 Model을 사용하여 데이터를 Thymeleaf로 전달&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;반환값이 board이면 src/main/resources/templates/board.html을 찾아 렌더링&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;5551&quot; data-start=&quot;5548&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;5582&quot; data-start=&quot;5553&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  4️⃣ Thymeleaf 파일 작성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;5627&quot; data-start=&quot;5583&quot; data-ke-size=&quot;size16&quot;&gt;  src/main/resources/templates/board.html&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;nbsp;xmlns:th=&quot;&lt;a href=&quot;http://www.thymeleaf.org&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://www.thymeleaf.org&lt;/a&gt;&quot;&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;게시판&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;게시판&amp;nbsp;목록&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;table&amp;nbsp;border=&quot;1&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th&amp;gt;내용&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;nbsp;th:each=&quot;post&amp;nbsp;:&amp;nbsp;${posts}&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;nbsp;th:text=&quot;${post.id}&quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;nbsp;th:text=&quot;${post.title}&quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;nbsp;th:text=&quot;${post.content}&quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;6215&quot; data-start=&quot;6105&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;th:each=&quot;post : ${posts}&quot; &amp;rarr; posts 리스트를 반복하며 출력&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;th:text=&quot;${post.title}&quot; &amp;rarr; 해당 값이 HTML에 삽입됨&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;6220&quot; data-start=&quot;6217&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;6236&quot; data-start=&quot;6222&quot;&gt;&lt;b&gt;  4. 결론&lt;/b&gt;&lt;/h1&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;6455&quot; data-start=&quot;6237&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;6455&quot; data-start=&quot;6287&quot;&gt;
&lt;tr data-end=&quot;6361&quot; data-start=&quot;6287&quot;&gt;
&lt;td&gt;설정 방법&lt;/td&gt;
&lt;td&gt;tomcat-embed-jasper 필요&lt;/td&gt;
&lt;td&gt;spring-boot-starter-thymeleaf만 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;6409&quot; data-start=&quot;6362&quot;&gt;
&lt;td&gt;문법&lt;/td&gt;
&lt;td&gt;JSTL 사용 (&amp;lt;c:forEach&amp;gt;)&lt;/td&gt;
&lt;td&gt;th:each 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;6455&quot; data-start=&quot;6410&quot;&gt;
&lt;td&gt;실행 위치&lt;/td&gt;
&lt;td&gt;/WEB-INF/views/&lt;/td&gt;
&lt;td&gt;/templates/&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>개발 이론/Spring</category>
      <category>SSR</category>
      <author>jeonghoe21</author>
      <guid isPermaLink="true">https://jeonghoe21.tistory.com/29</guid>
      <comments>https://jeonghoe21.tistory.com/29#entry29comment</comments>
      <pubDate>Tue, 18 Mar 2025 01:28:12 +0900</pubDate>
    </item>
    <item>
      <title>JSP 게시판 MS-SQL</title>
      <link>https://jeonghoe21.tistory.com/27</link>
      <description>&lt;h3 data-end=&quot;184&quot; data-start=&quot;166&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 요구사항 분석&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;388&quot; data-start=&quot;185&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;225&quot; data-start=&quot;185&quot;&gt;&lt;b&gt;리스트 출력&lt;/b&gt;: JSP에서 데이터 목록을 테이블 형식으로 출력.&lt;/li&gt;
&lt;li data-end=&quot;388&quot; data-start=&quot;226&quot;&gt;&lt;b&gt;CRUD 기능&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;388&quot; data-start=&quot;243&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;279&quot; data-start=&quot;243&quot;&gt;&lt;b&gt;생성 (Create)&lt;/b&gt;: 새 데이터를 추가하는 폼 제공.&lt;/li&gt;
&lt;li data-end=&quot;316&quot; data-start=&quot;282&quot;&gt;&lt;b&gt;조회 (Read)&lt;/b&gt;: 저장된 데이터를 리스트로 출력.&lt;/li&gt;
&lt;li data-end=&quot;354&quot; data-start=&quot;319&quot;&gt;&lt;b&gt;수정 (Update)&lt;/b&gt;: 기존 데이터를 수정하는 기능.&lt;/li&gt;
&lt;li data-end=&quot;388&quot; data-start=&quot;357&quot;&gt;&lt;b&gt;삭제 (Delete)&lt;/b&gt;: 선택한 데이터를 삭제.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;393&quot; data-start=&quot;390&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;413&quot; data-start=&quot;395&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 프로젝트 구조&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;/WEB-INF/&lt;br /&gt;&amp;nbsp;├──&amp;nbsp;views/&lt;br /&gt;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;list.jsp&amp;nbsp;&amp;nbsp;&amp;nbsp;(리스트&amp;nbsp;출력)&lt;br /&gt;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;form.jsp&amp;nbsp;&amp;nbsp;&amp;nbsp;(데이터&amp;nbsp;입력&amp;nbsp;폼)&lt;br /&gt;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;edit.jsp&amp;nbsp;&amp;nbsp;&amp;nbsp;(데이터&amp;nbsp;수정&amp;nbsp;폼)&lt;br /&gt;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;delete.jsp&amp;nbsp;(데이터&amp;nbsp;삭제)&lt;br /&gt;&amp;nbsp;├──&amp;nbsp;web.xml&lt;br /&gt;&amp;nbsp;├──&amp;nbsp;controller/&lt;br /&gt;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;StudentServlet.java&amp;nbsp;(전체&amp;nbsp;CRUD&amp;nbsp;처리)&lt;br /&gt;&amp;nbsp;├──&amp;nbsp;model/&lt;br /&gt;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;Student.java&amp;nbsp;(데이터&amp;nbsp;모델)&lt;br /&gt;&amp;nbsp;├──&amp;nbsp;repository/&lt;br /&gt;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;StudentRepository.java&amp;nbsp;(데이터&amp;nbsp;관리)&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;750&quot; data-start=&quot;747&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;767&quot; data-start=&quot;752&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 코드 구현&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;804&quot; data-start=&quot;769&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(1) Student.java (데이터 모델)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1742210148348&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;package model;

public class Student {
    private int id;
    private String name;
    private String email;

    public Student(int id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    public int getId() { return id; }
    public String getName() { return name; }
    public String getEmail() { return email; }

    public void setName(String name) { this.name = name; }
    public void setEmail(String email) { this.email = email; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;1326&quot; data-start=&quot;1323&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1374&quot; data-start=&quot;1328&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(2) StudentRepository.java (데이터 저장소)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 data-end=&quot;193&quot; data-start=&quot;169&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;MS-SQL 테이블 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;228&quot; data-start=&quot;194&quot; data-ke-size=&quot;size16&quot;&gt;먼저 MS-SQL에서 students 테이블을 생성합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; students ( id &lt;/span&gt;&lt;span&gt;&lt;span&gt;INT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;IDENTITY&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&lt;span&gt;PRIMARY&lt;/span&gt;&lt;/span&gt;&lt;span&gt; KEY,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;name NVARCHAR(&lt;/span&gt;&lt;span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&lt;span&gt;NOT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; email NVARCHAR(&lt;/span&gt;&lt;span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&lt;span&gt;NOT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;h3 data-end=&quot;422&quot; data-start=&quot;377&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;DbConnectionUtil.java (DB 연결 관리)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1742210248080&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;package repository;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DbConnectionUtil {
    private static final String URL = &quot;jdbc:sqlserver://localhost:1433;databaseName=your_database;encrypt=true;trustServerCertificate=true&quot;;
    private static final String USERNAME = &quot;your_username&quot;;
    private static final String PASSWORD = &quot;your_password&quot;;

    static {
        try {
            Class.forName(&quot;com.microsoft.sqlserver.jdbc.SQLServerDriver&quot;);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(&quot;SQL Server JDBC 드라이버를 찾을 수 없습니다.&quot;, e);
        }
    }

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USERNAME, PASSWORD);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1742210285950&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package repository;

import model.Student;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class StudentRepository {

    public List&amp;lt;Student&amp;gt; findAll() {
        List&amp;lt;Student&amp;gt; students = new ArrayList&amp;lt;&amp;gt;();
        String query = &quot;SELECT id, name, email FROM students&quot;;

        try (Connection conn = DbConnectionUtil.getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(query)) {

            while (rs.next()) {
                students.add(new Student(rs.getInt(&quot;id&quot;), rs.getString(&quot;name&quot;), rs.getString(&quot;email&quot;)));
            }
        } catch (SQLException e) {
            throw new RuntimeException(&quot;학생 목록 조회 중 오류 발생&quot;, e);
        }
        return students;
    }

    public Student findById(int id) {
        String query = &quot;SELECT id, name, email FROM students WHERE id = ?&quot;;
        try (Connection conn = DbConnectionUtil.getConnection();
             PreparedStatement stmt = conn.prepareStatement(query)) {

            stmt.setInt(1, id);
            try (ResultSet rs = stmt.executeQuery()) {
                if (rs.next()) {
                    return new Student(rs.getInt(&quot;id&quot;), rs.getString(&quot;name&quot;), rs.getString(&quot;email&quot;));
                }
            }
        } catch (SQLException e) {
            throw new RuntimeException(&quot;학생 조회 중 오류 발생&quot;, e);
        }
        return null;
    }

    public void save(Student student) {
        String query = &quot;INSERT INTO students (name, email) VALUES (?, ?)&quot;;
        try (Connection conn = DbConnectionUtil.getConnection();
             PreparedStatement stmt = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) {

            stmt.setString(1, student.getName());
            stmt.setString(2, student.getEmail());
            stmt.executeUpdate();

            try (ResultSet generatedKeys = stmt.getGeneratedKeys()) {
                if (generatedKeys.next()) {
                    student = new Student(generatedKeys.getInt(1), student.getName(), student.getEmail());
                }
            }
        } catch (SQLException e) {
            throw new RuntimeException(&quot;학생 등록 중 오류 발생&quot;, e);
        }
    }

    public void update(int id, String name, String email) {
        String query = &quot;UPDATE students SET name = ?, email = ? WHERE id = ?&quot;;
        try (Connection conn = DbConnectionUtil.getConnection();
             PreparedStatement stmt = conn.prepareStatement(query)) {

            stmt.setString(1, name);
            stmt.setString(2, email);
            stmt.setInt(3, id);
            stmt.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(&quot;학생 수정 중 오류 발생&quot;, e);
        }
    }

    public void delete(int id) {
        String query = &quot;DELETE FROM students WHERE id = ?&quot;;
        try (Connection conn = DbConnectionUtil.getConnection();
             PreparedStatement stmt = conn.prepareStatement(query)) {

            stmt.setInt(1, id);
            stmt.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(&quot;학생 삭제 중 오류 발생&quot;, e);
        }
    }
}​&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2420&quot; data-start=&quot;2417&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2462&quot; data-start=&quot;2422&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(3) StudentServlet.java (컨트롤러)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1742210335110&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@WebServlet(&quot;/students&quot;)
public class StudentServlet extends HttpServlet {
    private final StudentRepository repository = new StudentRepository();

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getParameter(&quot;action&quot;);

        if (&quot;edit&quot;.equals(action)) {
            int id = Integer.parseInt(request.getParameter(&quot;id&quot;));
            request.setAttribute(&quot;student&quot;, repository.findById(id));
            request.getRequestDispatcher(&quot;/WEB-INF/views/edit.jsp&quot;).forward(request, response);
        } else {
            List&amp;lt;Student&amp;gt; students = repository.findAll();
            request.setAttribute(&quot;students&quot;, students);
            request.getRequestDispatcher(&quot;/WEB-INF/views/list.jsp&quot;).forward(request, response);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getParameter(&quot;action&quot;);

        if (&quot;add&quot;.equals(action)) {
            String name = request.getParameter(&quot;name&quot;);
            String email = request.getParameter(&quot;email&quot;);
            repository.save(new Student(0, name, email));
        } else if (&quot;update&quot;.equals(action)) {
            int id = Integer.parseInt(request.getParameter(&quot;id&quot;));
            String name = request.getParameter(&quot;name&quot;);
            String email = request.getParameter(&quot;email&quot;);
            repository.update(id, name, email);
        } else if (&quot;delete&quot;.equals(action)) {
            int id = Integer.parseInt(request.getParameter(&quot;id&quot;));
            repository.delete(id);
        }

        response.sendRedirect(&quot;students&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;4568&quot; data-start=&quot;4565&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4587&quot; data-start=&quot;4570&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. JSP 페이지&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;4621&quot; data-start=&quot;4589&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(4) list.jsp (리스트 페이지)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1742210475078&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page contentType=&quot;text/html; charset=UTF-8&quot; %&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;학생 목록&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h2&amp;gt;학생 목록&amp;lt;/h2&amp;gt;
    &amp;lt;table border=&quot;1&quot;&amp;gt;
        &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;이름&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;이메일&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;액션&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
        &amp;lt;c:forEach var=&quot;student&quot; items=&quot;${students}&quot;&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;td&amp;gt;${student.id}&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;${student.name}&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;${student.email}&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;a href=&quot;students?action=edit&amp;amp;id=${student.id}&quot;&amp;gt;수정&amp;lt;/a&amp;gt;
                    &amp;lt;form action=&quot;students&quot; method=&quot;post&quot; style=&quot;display:inline;&quot;&amp;gt;
                        &amp;lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;${student.id}&quot;&amp;gt;
                        &amp;lt;input type=&quot;hidden&quot; name=&quot;action&quot; value=&quot;delete&quot;&amp;gt;
                        &amp;lt;button type=&quot;submit&quot;&amp;gt;삭제&amp;lt;/button&amp;gt;
                    &amp;lt;/form&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;lt;/c:forEach&amp;gt;
    &amp;lt;/table&amp;gt;
    &amp;lt;a href=&quot;form.jsp&quot;&amp;gt;새 학생 추가&amp;lt;/a&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;5583&quot; data-start=&quot;5580&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;5619&quot; data-start=&quot;5585&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(5) form.jsp (학생 추가 페이지)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1742210498704&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page contentType=&quot;text/html; charset=UTF-8&quot; %&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;학생 추가&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h2&amp;gt;학생 추가&amp;lt;/h2&amp;gt;
    &amp;lt;form action=&quot;students&quot; method=&quot;post&quot;&amp;gt;
        &amp;lt;input type=&quot;hidden&quot; name=&quot;action&quot; value=&quot;add&quot;&amp;gt;
        이름: &amp;lt;input type=&quot;text&quot; name=&quot;name&quot;&amp;gt;&amp;lt;br&amp;gt;
        이메일: &amp;lt;input type=&quot;text&quot; name=&quot;email&quot;&amp;gt;&amp;lt;br&amp;gt;
        &amp;lt;button type=&quot;submit&quot;&amp;gt;추가&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;6026&quot; data-start=&quot;6023&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;6062&quot; data-start=&quot;6028&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(6) edit.jsp (학생 수정 페이지)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1742210516960&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page contentType=&quot;text/html; charset=UTF-8&quot; %&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;학생 수정&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h2&amp;gt;학생 수정&amp;lt;/h2&amp;gt;
    &amp;lt;form action=&quot;students&quot; method=&quot;post&quot;&amp;gt;
        &amp;lt;input type=&quot;hidden&quot; name=&quot;action&quot; value=&quot;update&quot;&amp;gt;
        &amp;lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;${student.id}&quot;&amp;gt;
        이름: &amp;lt;input type=&quot;text&quot; name=&quot;name&quot; value=&quot;${student.name}&quot;&amp;gt;&amp;lt;br&amp;gt;
        이메일: &amp;lt;input type=&quot;text&quot; name=&quot;email&quot; value=&quot;${student.email}&quot;&amp;gt;&amp;lt;br&amp;gt;
        &amp;lt;button type=&quot;submit&quot;&amp;gt;수정&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>연습코드</category>
      <category>jsp</category>
      <author>jeonghoe21</author>
      <guid isPermaLink="true">https://jeonghoe21.tistory.com/27</guid>
      <comments>https://jeonghoe21.tistory.com/27#entry27comment</comments>
      <pubDate>Mon, 17 Mar 2025 20:26:36 +0900</pubDate>
    </item>
    <item>
      <title>HTML/CSS/JS</title>
      <link>https://jeonghoe21.tistory.com/26</link>
      <description>&lt;p data-end=&quot;238&quot; data-start=&quot;152&quot; data-ke-size=&quot;size16&quot;&gt;HTML은 웹 문서를 구성하는 마크업 언어.&lt;br /&gt;기본 태그뿐만 아니라 &lt;b&gt;폼 요소, 미디어 요소, 메타데이터, 인터랙티브 요소&lt;/b&gt;까지 모두 설명.&lt;/p&gt;
&lt;h2 data-end=&quot;262&quot; data-start=&quot;240&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1-1. HTML 기본 문법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;308&quot; data-start=&quot;263&quot; data-ke-size=&quot;size16&quot;&gt;HTML은 태그(&amp;lt;&amp;gt;)로 이루어져 있으며, 열리는 태그와 닫히는 태그가 있어.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;이것은 단락입니다.&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;!-- &amp;lt;p&amp;gt; 열리는 태그, &amp;lt;/p&amp;gt; 닫히는 태그 --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;img&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;src&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;image.jpg&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;이미지&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;!-- 닫는 태그가 없는 태그 --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;431&quot; data-start=&quot;428&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;455&quot; data-start=&quot;433&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1-2. HTML 요소 종류&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;477&quot; data-start=&quot;456&quot; data-ke-size=&quot;size16&quot;&gt;HTML 요소는 크게 4가지로 나뉘어.&lt;/p&gt;
&lt;h3 data-end=&quot;518&quot; data-start=&quot;479&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 블록 요소 (Block-level Elements)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;622&quot; data-start=&quot;519&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;538&quot; data-start=&quot;519&quot;&gt;화면 전체 너비를 차지하는 요소&lt;/li&gt;
&lt;li data-end=&quot;622&quot; data-start=&quot;539&quot;&gt;자동으로 줄 바꿈됨 (&amp;lt;div&amp;gt;, &amp;lt;p&amp;gt;, &amp;lt;h1&amp;gt; ~ &amp;lt;h6&amp;gt;, &amp;lt;ul&amp;gt;, &amp;lt;li&amp;gt;, &amp;lt;form&amp;gt;, &amp;lt;table&amp;gt; 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;div&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;이것은 블록 요소입니다.&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;div&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;이것도 블록 요소입니다.&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;718&quot; data-start=&quot;683&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 인라인 요소 (Inline Elements)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;800&quot; data-start=&quot;719&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;737&quot; data-start=&quot;719&quot;&gt;컨텐츠 크기만큼 차지하는 요소&lt;/li&gt;
&lt;li data-end=&quot;800&quot; data-start=&quot;738&quot;&gt;줄 바꿈이 되지 않음 (&amp;lt;span&amp;gt;, &amp;lt;a&amp;gt;, &amp;lt;strong&amp;gt;, &amp;lt;em&amp;gt;, &amp;lt;img&amp;gt; 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;span&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;이것은 인라인 요소입니다.&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;span&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;href&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;#&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;링크&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;906&quot; data-start=&quot;862&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) 인라인 블록 요소 (Inline-Block Elements)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;963&quot; data-start=&quot;907&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;963&quot; data-start=&quot;907&quot;&gt;크기를 조절할 수 있는 인라인 요소 (&amp;lt;button&amp;gt;, &amp;lt;input&amp;gt;, &amp;lt;img&amp;gt; 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;input&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;type&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;text&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;placeholder&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;입력하세요&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;img&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;src&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;image.jpg&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;이미지&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1053&quot; data-start=&quot;1050&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1094&quot; data-start=&quot;1055&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1-3. HTML 문서 메타데이터 (&amp;lt;head&amp;gt; 요소)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1171&quot; data-start=&quot;1096&quot; data-ke-size=&quot;size16&quot;&gt;HTML 문서의 &amp;lt;head&amp;gt; 태그 안에는 &lt;b&gt;메타데이터&lt;/b&gt;가 들어가.&lt;br /&gt;메타데이터는 브라우저에게 문서 정보를 제공하는 역할을 해.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1671&quot; data-start=&quot;1173&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1671&quot; data-start=&quot;1201&quot;&gt;
&lt;tr data-end=&quot;1241&quot; data-start=&quot;1201&quot;&gt;
&lt;td&gt;&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;문자 인코딩 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1329&quot; data-start=&quot;1242&quot;&gt;
&lt;td&gt;&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;반응형 웹 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1393&quot; data-start=&quot;1330&quot;&gt;
&lt;td&gt;&amp;lt;meta name=&quot;description&quot; content=&quot;웹페이지 설명&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;검색엔진을 위한 설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1464&quot; data-start=&quot;1394&quot;&gt;
&lt;td&gt;&amp;lt;meta name=&quot;keywords&quot; content=&quot;HTML, CSS, JavaScript&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;SEO 키워드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1514&quot; data-start=&quot;1465&quot;&gt;
&lt;td&gt;&amp;lt;meta name=&quot;author&quot; content=&quot;홍길동&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;작성자 정보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1554&quot; data-start=&quot;1515&quot;&gt;
&lt;td&gt;&amp;lt;title&amp;gt;문서 제목&amp;lt;/title&amp;gt;&lt;/td&gt;
&lt;td&gt;웹페이지 제목 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1617&quot; data-start=&quot;1555&quot;&gt;
&lt;td&gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;styles.css&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;외부 CSS 파일 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1671&quot; data-start=&quot;1618&quot;&gt;
&lt;td&gt;&amp;lt;script src=&quot;script.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/td&gt;
&lt;td&gt;외부 JS 파일 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;lt;head&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;meta&amp;nbsp;charset=&quot;UTF-8&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;meta&amp;nbsp;name=&quot;viewport&quot;&amp;nbsp;content=&quot;width=device-width,&amp;nbsp;initial-scale=1.0&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;meta&amp;nbsp;name=&quot;description&quot;&amp;nbsp;content=&quot;HTML,&amp;nbsp;CSS,&amp;nbsp;JavaScript&amp;nbsp;모든&amp;nbsp;문법&amp;nbsp;설명&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;meta&amp;nbsp;name=&quot;keywords&quot;&amp;nbsp;content=&quot;HTML,&amp;nbsp;CSS,&amp;nbsp;JavaScript&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;meta&amp;nbsp;name=&quot;author&quot;&amp;nbsp;content=&quot;홍길동&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;HTML&amp;nbsp;문법&amp;nbsp;정리&amp;lt;/title&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;link&amp;nbsp;rel=&quot;stylesheet&quot;&amp;nbsp;href=&quot;styles.css&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;script&amp;nbsp;src=&quot;script.js&quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;/head&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2089&quot; data-start=&quot;2086&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2112&quot; data-start=&quot;2091&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1-4. HTML 폼 요소&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2141&quot; data-start=&quot;2113&quot; data-ke-size=&quot;size16&quot;&gt;HTML 폼 요소는 사용자 입력을 받는 역할을 해.&lt;/p&gt;
&lt;h3 data-end=&quot;2165&quot; data-start=&quot;2143&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) &amp;lt;form&amp;gt; 태그&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2189&quot; data-start=&quot;2166&quot; data-ke-size=&quot;size16&quot;&gt;사용자 입력을 서버로 전송하는 역할을 함.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;lt;form&amp;nbsp;action=&quot;/submit&quot;&amp;nbsp;method=&quot;post&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input&amp;nbsp;type=&quot;text&quot;&amp;nbsp;name=&quot;username&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;button&amp;nbsp;type=&quot;submit&quot;&amp;gt;제출&amp;lt;/button&amp;gt; &lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2359&quot; data-start=&quot;2328&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) &amp;lt;input&amp;gt; 태그 (입력 필드)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2379&quot; data-start=&quot;2360&quot; data-ke-size=&quot;size16&quot;&gt;다양한 입력 타입을 가질 수 있어.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2561&quot; data-start=&quot;2381&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2561&quot; data-start=&quot;2409&quot;&gt;
&lt;tr data-end=&quot;2431&quot; data-start=&quot;2409&quot;&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;일반 텍스트 입력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2456&quot; data-start=&quot;2432&quot;&gt;
&lt;td&gt;password&lt;/td&gt;
&lt;td&gt;비밀번호 입력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2477&quot; data-start=&quot;2457&quot;&gt;
&lt;td&gt;email&lt;/td&gt;
&lt;td&gt;이메일 입력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2498&quot; data-start=&quot;2478&quot;&gt;
&lt;td&gt;number&lt;/td&gt;
&lt;td&gt;숫자 입력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2520&quot; data-start=&quot;2499&quot;&gt;
&lt;td&gt;checkbox&lt;/td&gt;
&lt;td&gt;체크박스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2541&quot; data-start=&quot;2521&quot;&gt;
&lt;td&gt;radio&lt;/td&gt;
&lt;td&gt;라디오 버튼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2561&quot; data-start=&quot;2542&quot;&gt;
&lt;td&gt;file&lt;/td&gt;
&lt;td&gt;파일 업로드&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;lt;input&amp;nbsp;type=&quot;text&quot;&amp;nbsp;placeholder=&quot;이름&amp;nbsp;입력&quot;&amp;gt; &lt;br /&gt;&amp;lt;input&amp;nbsp;type=&quot;password&quot;&amp;nbsp;placeholder=&quot;비밀번호&amp;nbsp;입력&quot;&amp;gt; &lt;br /&gt;&amp;lt;input&amp;nbsp;type=&quot;email&quot;&amp;nbsp;placeholder=&quot;이메일&amp;nbsp;입력&quot;&amp;gt; &lt;br /&gt;&amp;lt;input&amp;nbsp;type=&quot;checkbox&quot;&amp;gt;&amp;nbsp;동의합니다. &lt;br /&gt;&amp;lt;input&amp;nbsp;type=&quot;radio&quot;&amp;nbsp;name=&quot;gender&quot;&amp;nbsp;value=&quot;male&quot;&amp;gt;&amp;nbsp;남성 &lt;br /&gt;&amp;lt;input&amp;nbsp;type=&quot;radio&quot;&amp;nbsp;name=&quot;gender&quot;&amp;nbsp;value=&quot;female&quot;&amp;gt;&amp;nbsp;여성&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2870&quot; data-start=&quot;2839&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) &amp;lt;select&amp;gt; 태그 (드롭다운)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;select&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;name&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;country&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;option&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;value&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;kr&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;한국&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;option&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;option&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;value&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;us&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;미국&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;option&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;select&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3023&quot; data-start=&quot;2988&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) &amp;lt;textarea&amp;gt; 태그 (긴 글 입력)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;textarea&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;rows&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;5&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;cols&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;30&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;textarea&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3081&quot; data-start=&quot;3078&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3103&quot; data-start=&quot;3083&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1-5. HTML 테이블&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3132&quot; data-start=&quot;3104&quot; data-ke-size=&quot;size16&quot;&gt;HTML에서 데이터를 표 형태로 표현할 때 사용해.&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;table&amp;nbsp;border=&quot;1&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th&amp;gt;이름&amp;lt;/th&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th&amp;gt;나이&amp;lt;/th&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;홍길동&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;30&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3412&quot; data-start=&quot;3294&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3412&quot; data-start=&quot;3322&quot;&gt;
&lt;tr data-end=&quot;3344&quot; data-start=&quot;3322&quot;&gt;
&lt;td&gt;&amp;lt;table&amp;gt;&lt;/td&gt;
&lt;td&gt;테이블 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3367&quot; data-start=&quot;3345&quot;&gt;
&lt;td&gt;&amp;lt;tr&amp;gt;&lt;/td&gt;
&lt;td&gt;행(row) 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3393&quot; data-start=&quot;3368&quot;&gt;
&lt;td&gt;&amp;lt;th&amp;gt;&lt;/td&gt;
&lt;td&gt;제목 셀 (굵게 표시)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3412&quot; data-start=&quot;3394&quot;&gt;
&lt;td&gt;&amp;lt;td&amp;gt;&lt;/td&gt;
&lt;td&gt;데이터 셀&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-end=&quot;3417&quot; data-start=&quot;3414&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3442&quot; data-start=&quot;3419&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1-6. HTML 미디어 요소&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3468&quot; data-start=&quot;3443&quot; data-ke-size=&quot;size16&quot;&gt;HTML은 오디오, 비디오를 삽입할 수 있어.&lt;/p&gt;
&lt;h3 data-end=&quot;3502&quot; data-start=&quot;3470&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) &amp;lt;audio&amp;gt; 태그 (오디오 삽입)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&amp;lt;audio&amp;nbsp;controls&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;source&amp;nbsp;src=&quot;audio.mp3&quot;&amp;nbsp;type=&quot;audio/mpeg&quot;&amp;gt; &lt;br /&gt;&amp;lt;/audio&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3621&quot; data-start=&quot;3589&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) &amp;lt;video&amp;gt; 태그 (비디오 삽입)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&amp;lt;video&amp;nbsp;controls&amp;nbsp;width=&quot;400&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;source&amp;nbsp;src=&quot;video.mp4&quot;&amp;nbsp;type=&quot;video/mp4&quot;&amp;gt; &lt;br /&gt;&amp;lt;/video&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3722&quot; data-start=&quot;3719&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3749&quot; data-start=&quot;3724&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1-7. HTML 인터랙티브 요소&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3781&quot; data-start=&quot;3750&quot; data-ke-size=&quot;size16&quot;&gt;HTML에는 사용자 인터랙션을 위한 다양한 요소가 있어.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태그설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3926&quot; data-start=&quot;3783&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3926&quot; data-start=&quot;3811&quot;&gt;
&lt;tr data-end=&quot;3839&quot; data-start=&quot;3811&quot;&gt;
&lt;td&gt;&amp;lt;details&amp;gt;&lt;/td&gt;
&lt;td&gt;펼칠 수 있는 박스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3875&quot; data-start=&quot;3840&quot;&gt;
&lt;td&gt;&amp;lt;summary&amp;gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;details&amp;gt; 안의 제목&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3900&quot; data-start=&quot;3876&quot;&gt;
&lt;td&gt;&amp;lt;dialog&amp;gt;&lt;/td&gt;
&lt;td&gt;모달 대화상자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3926&quot; data-start=&quot;3901&quot;&gt;
&lt;td&gt;&amp;lt;progress&amp;gt;&lt;/td&gt;
&lt;td&gt;진행률 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;lt;details&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;summary&amp;gt;더&amp;nbsp;보기&amp;lt;/summary&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;이것은&amp;nbsp;추가&amp;nbsp;정보입니다.&amp;lt;/p&amp;gt; &lt;br /&gt;&amp;lt;/details&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;progress&amp;nbsp;value=&quot;70&quot;&amp;nbsp;max=&quot;100&quot;&amp;gt;&amp;lt;/progress&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;124&quot; data-start=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;이제 HTML에 스타일을 적용하는 &lt;b&gt;CSS&lt;/b&gt;를 심화해서 다룰게.&lt;br /&gt;&lt;b&gt;CSS는 HTML을 꾸미는 언어&lt;/b&gt;로, &lt;b&gt;색상, 폰트, 크기, 레이아웃, 애니메이션 등&lt;/b&gt;을 정의할 수 있어.&lt;/p&gt;
&lt;hr data-end=&quot;129&quot; data-start=&quot;126&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;152&quot; data-start=&quot;131&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2-1. CSS 적용 방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;181&quot; data-start=&quot;153&quot; data-ke-size=&quot;size16&quot;&gt;CSS를 HTML에 적용하는 방법은 3가지가 있어.&lt;/p&gt;
&lt;h3 data-end=&quot;214&quot; data-start=&quot;183&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 인라인 스타일 (Inline CSS)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;250&quot; data-start=&quot;215&quot; data-ke-size=&quot;size16&quot;&gt;HTML 태그 안에 style 속성을 이용해 적용하는 방식.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;style&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;color: blue; font-size: 20px;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;이것은 파란색 글씨입니다.&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;382&quot; data-start=&quot;324&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;350&quot; data-start=&quot;324&quot;&gt;&lt;b&gt;장점&lt;/b&gt;: 특정 요소만 스타일 적용 가능&lt;/li&gt;
&lt;li data-end=&quot;382&quot; data-start=&quot;351&quot;&gt;&lt;b&gt;단점&lt;/b&gt;: 유지보수 어려움, 코드 가독성이 떨어짐&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;387&quot; data-start=&quot;384&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;421&quot; data-start=&quot;389&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 내부 스타일 (Internal CSS)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;464&quot; data-start=&quot;422&quot; data-ke-size=&quot;size16&quot;&gt;HTML의 &amp;lt;head&amp;gt; 태그 안에 &amp;lt;style&amp;gt; 태그를 이용해 적용.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;head&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;style&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&lt;span&gt;color&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: red; &lt;/span&gt;&lt;span&gt;&lt;span&gt;font-size&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&lt;span&gt;18px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;style&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;head&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;673&quot; data-start=&quot;594&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;629&quot; data-start=&quot;594&quot;&gt;&lt;b&gt;장점&lt;/b&gt;: 하나의 문서에서 여러 요소에 스타일 적용 가능&lt;/li&gt;
&lt;li data-end=&quot;673&quot; data-start=&quot;630&quot;&gt;&lt;b&gt;단점&lt;/b&gt;: HTML 문서 안에 CSS 코드가 포함되므로 관리가 어렵다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;678&quot; data-start=&quot;675&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;712&quot; data-start=&quot;680&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) 외부 스타일 (External CSS)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;748&quot; data-start=&quot;713&quot; data-ke-size=&quot;size16&quot;&gt;별도의 .css 파일을 만들어 &amp;lt;link&amp;gt; 태그로 연결.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;head&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;stylesheet&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;href&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;styles.css&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;head&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;844&quot; data-start=&quot;823&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;844&quot; data-start=&quot;823&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;styles.css 파일 내용:&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;844&quot; data-start=&quot;823&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;color&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;: green; &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;font-size&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;16px&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;986&quot; data-start=&quot;901&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;939&quot; data-start=&quot;901&quot;&gt;&lt;b&gt;장점&lt;/b&gt;: 여러 HTML 문서에서 공통으로 스타일을 적용 가능&lt;/li&gt;
&lt;li data-end=&quot;986&quot; data-start=&quot;940&quot;&gt;&lt;b&gt;단점&lt;/b&gt;: HTML 파일과 CSS 파일이 분리되어 있으므로 추가 요청이 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;991&quot; data-start=&quot;988&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1014&quot; data-start=&quot;993&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2-2. CSS 기본 문법&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;선택자 { 속성: 값; } &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1048&quot; data-start=&quot;1045&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1048&quot; data-start=&quot;1045&quot; data-ke-size=&quot;size16&quot;&gt;예제:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&lt;span&gt;color&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: blue; &lt;/span&gt;&lt;span&gt;&lt;span&gt;font-size&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&lt;span&gt;24px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; } &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1109&quot; data-start=&quot;1106&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1142&quot; data-start=&quot;1111&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2-3. CSS 선택자 (Selectors)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1171&quot; data-start=&quot;1143&quot; data-ke-size=&quot;size16&quot;&gt;CSS에서 특정 HTML 요소를 선택하는 방법이야.&lt;/p&gt;
&lt;h3 data-end=&quot;1190&quot; data-start=&quot;1173&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 기본 선택자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택자설명예제&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1427&quot; data-start=&quot;1191&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1427&quot; data-start=&quot;1234&quot;&gt;
&lt;tr data-end=&quot;1273&quot; data-start=&quot;1234&quot;&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;모든 요소 선택&lt;/td&gt;
&lt;td&gt;* { margin: 0; }&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1316&quot; data-start=&quot;1274&quot;&gt;
&lt;td&gt;태그명&lt;/td&gt;
&lt;td&gt;특정 태그 선택&lt;/td&gt;
&lt;td&gt;p { color: red; }&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1371&quot; data-start=&quot;1317&quot;&gt;
&lt;td&gt;.클래스명&lt;/td&gt;
&lt;td&gt;특정 클래스 선택&lt;/td&gt;
&lt;td&gt;.box { background: gray; }&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1427&quot; data-start=&quot;1372&quot;&gt;
&lt;td&gt;#아이디명&lt;/td&gt;
&lt;td&gt;특정 ID 선택&lt;/td&gt;
&lt;td&gt;#header { font-size: 20px; }&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;text&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;클래스 선택자 예제&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;id&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;unique&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;아이디 선택자 예제&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;.text&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&lt;span&gt;color&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: blue; } &lt;/span&gt;&lt;span&gt;&lt;span&gt;#unique&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&lt;span&gt;color&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: green; } &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1575&quot; data-start=&quot;1572&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1594&quot; data-start=&quot;1577&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 조합 선택자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택자설명예제&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1860&quot; data-start=&quot;1595&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1860&quot; data-start=&quot;1638&quot;&gt;
&lt;tr data-end=&quot;1688&quot; data-start=&quot;1638&quot;&gt;
&lt;td&gt;A B&lt;/td&gt;
&lt;td&gt;A 안의 B 요소 선택&lt;/td&gt;
&lt;td&gt;div p { color: red; }&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1745&quot; data-start=&quot;1689&quot;&gt;
&lt;td&gt;A &amp;gt; B&lt;/td&gt;
&lt;td&gt;A의 직계 자식 B 선택&lt;/td&gt;
&lt;td&gt;div &amp;gt; p { color: blue; }&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1801&quot; data-start=&quot;1746&quot;&gt;
&lt;td&gt;A + B&lt;/td&gt;
&lt;td&gt;A 바로 뒤의 B 선택&lt;/td&gt;
&lt;td&gt;h1 + p { color: green; }&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1860&quot; data-start=&quot;1802&quot;&gt;
&lt;td&gt;A ~ B&lt;/td&gt;
&lt;td&gt;A 다음에 오는 모든 B 선택&lt;/td&gt;
&lt;td&gt;h1 ~ p { color: gray; }&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;div&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;첫 번째 단락&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;두 번째 단락&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;div&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;div&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&lt;span&gt;color&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: red; } &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1968&quot; data-start=&quot;1965&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1991&quot; data-start=&quot;1970&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2-4. CSS 박스 모델&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2032&quot; data-start=&quot;1992&quot; data-ke-size=&quot;size16&quot;&gt;웹 요소의 크기를 결정하는 &lt;b&gt;Box Model&lt;/b&gt; 개념을 이해해야 해.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2141&quot; data-start=&quot;2034&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2058&quot; data-start=&quot;2034&quot;&gt;&lt;b&gt;content&lt;/b&gt;: 요소의 실제 내용&lt;/li&gt;
&lt;li data-end=&quot;2095&quot; data-start=&quot;2059&quot;&gt;&lt;b&gt;padding&lt;/b&gt;: content와 border 사이 여백&lt;/li&gt;
&lt;li data-end=&quot;2113&quot; data-start=&quot;2096&quot;&gt;&lt;b&gt;border&lt;/b&gt;: 테두리&lt;/li&gt;
&lt;li data-end=&quot;2141&quot; data-start=&quot;2114&quot;&gt;&lt;b&gt;margin&lt;/b&gt;: 요소와 요소 사이의 거리&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;.box&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&lt;span&gt;width&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&lt;span&gt;200px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;height&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&lt;span&gt;100px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;padding&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&lt;span&gt;20px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;border&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&lt;span&gt;5px&lt;/span&gt;&lt;/span&gt;&lt;span&gt; solid black; &lt;/span&gt;&lt;span&gt;&lt;span&gt;margin&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&lt;span&gt;30px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;div&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;box&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;박스 모델&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;div&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2312&quot; data-start=&quot;2309&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2334&quot; data-start=&quot;2314&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2-5. CSS 포지셔닝&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2363&quot; data-start=&quot;2335&quot; data-ke-size=&quot;size16&quot;&gt;CSS에서 요소를 배치하는 방법이 여러 가지 있어.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2549&quot; data-start=&quot;2365&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2549&quot; data-start=&quot;2397&quot;&gt;
&lt;tr data-end=&quot;2430&quot; data-start=&quot;2397&quot;&gt;
&lt;td&gt;static&lt;/td&gt;
&lt;td&gt;기본값 (HTML 흐름대로 배치)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2462&quot; data-start=&quot;2431&quot;&gt;
&lt;td&gt;relative&lt;/td&gt;
&lt;td&gt;현재 위치를 기준으로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2494&quot; data-start=&quot;2463&quot;&gt;
&lt;td&gt;absolute&lt;/td&gt;
&lt;td&gt;부모 요소를 기준으로 배치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2520&quot; data-start=&quot;2495&quot;&gt;
&lt;td&gt;fixed&lt;/td&gt;
&lt;td&gt;화면을 기준으로 고정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2549&quot; data-start=&quot;2521&quot;&gt;
&lt;td&gt;sticky&lt;/td&gt;
&lt;td&gt;스크롤에 따라 위치 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;.box&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&lt;span&gt;position&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: absolute; &lt;/span&gt;&lt;span&gt;&lt;span&gt;top&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&lt;span&gt;50px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;left&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&lt;span&gt;100px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;div&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;box&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;절대 위치&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;div&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2673&quot; data-start=&quot;2670&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2709&quot; data-start=&quot;2675&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2-6. CSS Flexbox (유연한 레이아웃)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2740&quot; data-start=&quot;2710&quot; data-ke-size=&quot;size16&quot;&gt;Flexbox는 요소를 수평, 수직 정렬할 때 유용해.&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;.container&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;display:&amp;nbsp;flex; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;justify-content:&amp;nbsp;center;&amp;nbsp;/*&amp;nbsp;가로&amp;nbsp;중앙&amp;nbsp;정렬&amp;nbsp;*/ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;align-items:&amp;nbsp;center;&amp;nbsp;/*&amp;nbsp;세로&amp;nbsp;중앙&amp;nbsp;정렬&amp;nbsp;*/ &lt;br /&gt;}&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;lt;div&amp;nbsp;class=&quot;container&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt;아이템&amp;nbsp;1&amp;lt;/div&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt;아이템&amp;nbsp;2&amp;lt;/div&amp;gt; &lt;br /&gt;&amp;lt;/div&amp;gt; &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2961&quot; data-start=&quot;2958&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2994&quot; data-start=&quot;2963&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2-7. CSS Grid (그리드 레이아웃)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3020&quot; data-start=&quot;2995&quot; data-ke-size=&quot;size16&quot;&gt;Grid는 복잡한 레이아웃을 만들 때 사용해.&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;.container&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;display:&amp;nbsp;grid; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grid-template-columns:&amp;nbsp;1fr&amp;nbsp;2fr; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grid-template-rows:&amp;nbsp;100px&amp;nbsp;200px; &lt;br /&gt;} &lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;lt;div&amp;nbsp;class=&quot;container&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt;아이템&amp;nbsp;1&amp;lt;/div&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt;아이템&amp;nbsp;2&amp;lt;/div&amp;gt; &lt;br /&gt;&amp;lt;/div&amp;gt; &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3230&quot; data-start=&quot;3227&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3253&quot; data-start=&quot;3232&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2-8. CSS 애니메이션&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3273&quot; data-start=&quot;3254&quot; data-ke-size=&quot;size16&quot;&gt;애니메이션을 적용하는 방법이 있어.&lt;/p&gt;
&lt;h3 data-end=&quot;3306&quot; data-start=&quot;3275&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) transition (부드러운 변화)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;.button&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;background-color:&amp;nbsp;blue; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transition:&amp;nbsp;background-color&amp;nbsp;0.5s&amp;nbsp;ease-in-out; &lt;br /&gt;} &lt;br /&gt;.button:hover&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;background-color:&amp;nbsp;red; &lt;br /&gt;} &lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;button&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;button&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;버튼&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;button&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3532&quot; data-start=&quot;3503&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) @keyframes (애니메이션)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;@keyframes&amp;nbsp;fadeIn&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from&amp;nbsp;{&amp;nbsp;opacity:&amp;nbsp;0;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;to&amp;nbsp;{&amp;nbsp;opacity:&amp;nbsp;1;&amp;nbsp;} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;.box&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;animation:&amp;nbsp;fadeIn&amp;nbsp;2s&amp;nbsp;ease-in-out; &lt;br /&gt;} &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;lt;div&amp;nbsp;class=&quot;box&quot;&amp;gt;애니메이션&amp;lt;/div&amp;gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;126&quot; data-start=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;이제 JavaScript(JS)의 모든 문법을 심층적으로 설명할게.&lt;br /&gt;JS는 &lt;b&gt;HTML을 동적으로 조작하고, 사용자 이벤트를 처리하며, 서버와 데이터를 주고받는 역할&lt;/b&gt;을 해.&lt;/p&gt;
&lt;hr data-end=&quot;131&quot; data-start=&quot;128&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;161&quot; data-start=&quot;133&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3-1. JavaScript 기본 문법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;178&quot; data-start=&quot;162&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 변수 선언&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;216&quot; data-start=&quot;179&quot; data-ke-size=&quot;size16&quot;&gt;변수 선언 방법에는 var, let, const가 있어.&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var&amp;nbsp;a&amp;nbsp;=&amp;nbsp;10;&amp;nbsp;&amp;nbsp;//&amp;nbsp;함수&amp;nbsp;스코프,&amp;nbsp;재할당&amp;nbsp;가능 &lt;br /&gt;let&amp;nbsp;b&amp;nbsp;=&amp;nbsp;20;&amp;nbsp;&amp;nbsp;//&amp;nbsp;블록&amp;nbsp;스코프,&amp;nbsp;재할당&amp;nbsp;가능 &lt;br /&gt;const&amp;nbsp;c&amp;nbsp;=&amp;nbsp;30;&amp;nbsp;//&amp;nbsp;블록&amp;nbsp;스코프,&amp;nbsp;재할당&amp;nbsp;불가능 &lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;500&quot; data-start=&quot;324&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;500&quot; data-start=&quot;418&quot;&gt;
&lt;tr data-end=&quot;444&quot; data-start=&quot;418&quot;&gt;
&lt;td&gt;var&lt;/td&gt;
&lt;td&gt;함수 스코프&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;471&quot; data-start=&quot;445&quot;&gt;
&lt;td&gt;let&lt;/td&gt;
&lt;td&gt;블록 스코프&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;500&quot; data-start=&quot;472&quot;&gt;
&lt;td&gt;const&lt;/td&gt;
&lt;td&gt;블록 스코프&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-end=&quot;505&quot; data-start=&quot;502&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;524&quot; data-start=&quot;507&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 데이터 타입&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;573&quot; data-start=&quot;525&quot; data-ke-size=&quot;size16&quot;&gt;JS의 데이터 타입에는 기본형(Primitive)과 참조형(Reference)이 있어.&lt;/p&gt;
&lt;h4 data-end=&quot;603&quot; data-start=&quot;575&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;기본형 데이터 (Primitive)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 타입예제&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;910&quot; data-start=&quot;604&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;910&quot; data-start=&quot;642&quot;&gt;
&lt;tr data-end=&quot;673&quot; data-start=&quot;642&quot;&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;let num = 100;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;710&quot; data-start=&quot;674&quot;&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;let text = &quot;Hello&quot;;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;747&quot; data-start=&quot;711&quot;&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;let isTrue = true;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;780&quot; data-start=&quot;748&quot;&gt;
&lt;td&gt;Null&lt;/td&gt;
&lt;td&gt;let empty = null;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;816&quot; data-start=&quot;781&quot;&gt;
&lt;td&gt;Undefined&lt;/td&gt;
&lt;td&gt;let notDefined;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;860&quot; data-start=&quot;817&quot;&gt;
&lt;td&gt;Symbol&lt;/td&gt;
&lt;td&gt;let unique = Symbol('id');&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;910&quot; data-start=&quot;861&quot;&gt;
&lt;td&gt;BigInt&lt;/td&gt;
&lt;td&gt;let big = 12345678901234567890n;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-end=&quot;940&quot; data-start=&quot;912&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;참조형 데이터 (Reference)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 타입예제&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1146&quot; data-start=&quot;941&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1146&quot; data-start=&quot;979&quot;&gt;
&lt;tr data-end=&quot;1033&quot; data-start=&quot;979&quot;&gt;
&lt;td&gt;Object&lt;/td&gt;
&lt;td&gt;let person = { name: &quot;철수&quot;, age: 25 };&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1080&quot; data-start=&quot;1034&quot;&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;let numbers = [1, 2, 3, 4, 5];&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1146&quot; data-start=&quot;1081&quot;&gt;
&lt;td&gt;Function&lt;/td&gt;
&lt;td&gt;function sayHello() { console.log(&quot;Hello!&quot;); }&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-end=&quot;1151&quot; data-start=&quot;1148&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1167&quot; data-start=&quot;1153&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) 연산자&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;1183&quot; data-start=&quot;1168&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;산술 연산자&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;a&amp;nbsp;=&amp;nbsp;10; &lt;br /&gt;let&amp;nbsp;b&amp;nbsp;=&amp;nbsp;3; &lt;br /&gt;console.log(a&amp;nbsp;+&amp;nbsp;b);&amp;nbsp;&amp;nbsp;//&amp;nbsp;더하기 &lt;br /&gt;console.log(a&amp;nbsp;-&amp;nbsp;b);&amp;nbsp;&amp;nbsp;//&amp;nbsp;빼기 &lt;br /&gt;console.log(a&amp;nbsp;*&amp;nbsp;b);&amp;nbsp;&amp;nbsp;//&amp;nbsp;곱하기 &lt;br /&gt;console.log(a&amp;nbsp;/&amp;nbsp;b);&amp;nbsp;&amp;nbsp;//&amp;nbsp;나누기 &lt;br /&gt;console.log(a&amp;nbsp;%&amp;nbsp;b);&amp;nbsp;&amp;nbsp;//&amp;nbsp;나머지 &lt;br /&gt;console.log(a&amp;nbsp;**&amp;nbsp;b);&amp;nbsp;//&amp;nbsp;제곱 &lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1399&quot; data-start=&quot;1384&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;비교 연산자&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;console.log(5&amp;nbsp;==&amp;nbsp;&quot;5&quot;);&amp;nbsp;&amp;nbsp;//&amp;nbsp;true&amp;nbsp;(값만&amp;nbsp;비교) &lt;br /&gt;console.log(5&amp;nbsp;===&amp;nbsp;&quot;5&quot;);&amp;nbsp;//&amp;nbsp;false&amp;nbsp;(타입까지&amp;nbsp;비교) &lt;br /&gt;console.log(5&amp;nbsp;!=&amp;nbsp;&quot;5&quot;);&amp;nbsp;&amp;nbsp;//&amp;nbsp;false &lt;br /&gt;console.log(5&amp;nbsp;!==&amp;nbsp;&quot;5&quot;);&amp;nbsp;//&amp;nbsp;true &lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1574&quot; data-start=&quot;1559&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;논리 연산자&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;console.log(true&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;false);&amp;nbsp;//&amp;nbsp;false &lt;br /&gt;console.log(true&amp;nbsp;||&amp;nbsp;false);&amp;nbsp;//&amp;nbsp;true &lt;br /&gt;console.log(!true);&amp;nbsp;//&amp;nbsp;false &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1691&quot; data-start=&quot;1688&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1714&quot; data-start=&quot;1693&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3-2. 조건문 &amp;amp; 반복문&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;1742&quot; data-start=&quot;1715&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 조건문 (if, switch)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;score&amp;nbsp;=&amp;nbsp;85; &lt;br /&gt;&lt;br /&gt;if&amp;nbsp;(score&amp;nbsp;&amp;gt;=&amp;nbsp;90)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;A&amp;nbsp;학점&quot;); &lt;br /&gt;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(score&amp;nbsp;&amp;gt;=&amp;nbsp;80)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;B&amp;nbsp;학점&quot;); &lt;br /&gt;}&amp;nbsp;else&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;C&amp;nbsp;학점&quot;); &lt;br /&gt;} &lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;fruit&amp;nbsp;=&amp;nbsp;&quot;사과&quot;; &lt;br /&gt;&lt;br /&gt;switch&amp;nbsp;(fruit)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&quot;사과&quot;: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;사과입니다.&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&quot;바나나&quot;: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;바나나입니다.&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;과일을&amp;nbsp;찾을&amp;nbsp;수&amp;nbsp;없습니다.&quot;); &lt;br /&gt;} &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2130&quot; data-start=&quot;2127&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2159&quot; data-start=&quot;2132&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 반복문 (for, while)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;for&amp;nbsp;(let&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;5;&amp;nbsp;i++)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(i); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;let&amp;nbsp;count&amp;nbsp;=&amp;nbsp;0; &lt;br /&gt;while&amp;nbsp;(count&amp;nbsp;&amp;lt;&amp;nbsp;5)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(count); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count++; &lt;br /&gt;} &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2301&quot; data-start=&quot;2298&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2328&quot; data-start=&quot;2303&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3-3. 함수 (Function)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;2346&quot; data-start=&quot;2329&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 함수 선언식&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;function&amp;nbsp;sayHello(name)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&quot;Hello,&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;name; &lt;br /&gt;} &lt;br /&gt;console.log(sayHello(&quot;철수&quot;)); &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2461&quot; data-start=&quot;2444&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 함수 표현식&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;const&amp;nbsp;sayHello&amp;nbsp;=&amp;nbsp;function(name)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&quot;Hello,&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;name; &lt;br /&gt;}; &lt;br /&gt;console.log(sayHello(&quot;영희&quot;)); &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2585&quot; data-start=&quot;2568&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) 화살표 함수&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;const&amp;nbsp;sayHello&amp;nbsp;=&amp;nbsp;(name)&amp;nbsp;=&amp;gt;&amp;nbsp;`Hello,&amp;nbsp;${name}`; &lt;br /&gt;console.log(sayHello(&quot;민수&quot;)); &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2674&quot; data-start=&quot;2671&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2695&quot; data-start=&quot;2676&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3-4. 객체 &amp;amp; 배열&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;2713&quot; data-start=&quot;2696&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 객체 다루기&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;person&amp;nbsp;=&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;&quot;철수&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;age:&amp;nbsp;25, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;greet:&amp;nbsp;function()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(`안녕하세요,&amp;nbsp;저는&amp;nbsp;${this.name}입니다.`); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}; &lt;br /&gt;person.greet(); &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2886&quot; data-start=&quot;2869&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 배열 다루기&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;fruits&amp;nbsp;=&amp;nbsp;[&quot;사과&quot;,&amp;nbsp;&quot;바나나&quot;,&amp;nbsp;&quot;포도&quot;]; &lt;br /&gt;console.log(fruits[1]);&amp;nbsp;//&amp;nbsp;&quot;바나나&quot; &lt;br /&gt;fruits.push(&quot;오렌지&quot;);&amp;nbsp;//&amp;nbsp;배열에&amp;nbsp;추가 &lt;br /&gt;fruits.pop();&amp;nbsp;//&amp;nbsp;마지막&amp;nbsp;요소&amp;nbsp;제거 &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3025&quot; data-start=&quot;3022&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div&gt;
&lt;h2 data-end=&quot;42&quot; data-start=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3-5. DOM 조작 (Document Object Model)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;173&quot; data-start=&quot;43&quot; data-ke-size=&quot;size16&quot;&gt;**DOM(Document Object Model, 문서 객체 모델)**은 HTML 문서를 트리(tree) 구조로 표현하는 방식이야.&lt;br /&gt;JavaScript를 사용하면 DOM을 조작하여 HTML 요소를 추가, 수정, 삭제할 수 있어.&lt;/p&gt;
&lt;hr data-end=&quot;178&quot; data-start=&quot;175&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;195&quot; data-start=&quot;180&quot;&gt;&lt;b&gt;1. DOM이란?&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;299&quot; data-start=&quot;196&quot; data-ke-size=&quot;size16&quot;&gt;웹 페이지를 로딩하면 브라우저는 HTML 문서를 해석하여 &lt;b&gt;트리 구조로 변환&lt;/b&gt;해.&lt;br /&gt;이걸 &lt;b&gt;DOM 트리&lt;/b&gt;라고 부르고, JavaScript를 사용해서 이 트리를 조작할 수 있어.&lt;/p&gt;
&lt;p data-end=&quot;326&quot; data-start=&quot;301&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 아래 HTML이 있다고 가정하자.&lt;/p&gt;
&lt;p data-end=&quot;326&quot; data-start=&quot;301&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-end=&quot;644&quot; data-start=&quot;615&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;gt; &lt;br /&gt;&amp;lt;html&amp;nbsp;lang=&quot;ko&quot;&amp;gt; &lt;br /&gt;&amp;lt;head&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;DOM&amp;nbsp;예제&amp;lt;/title&amp;gt; &lt;br /&gt;&amp;lt;/head&amp;gt; &lt;br /&gt;&amp;lt;body&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;nbsp;id=&quot;title&quot;&amp;gt;안녕하세요!&amp;lt;/h1&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;nbsp;class=&quot;text&quot;&amp;gt;첫&amp;nbsp;번째&amp;nbsp;문장입니다.&amp;lt;/p&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;nbsp;class=&quot;text&quot;&amp;gt;두&amp;nbsp;번째&amp;nbsp;문장입니다.&amp;lt;/p&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;button&amp;nbsp;id=&quot;btn&quot;&amp;gt;클릭하세요&amp;lt;/button&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;script&amp;nbsp;src=&quot;script.js&quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;/body&amp;gt; &lt;br /&gt;&amp;lt;/html&amp;gt; &lt;/p&gt;
&lt;p data-end=&quot;644&quot; data-start=&quot;615&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;644&quot; data-start=&quot;615&quot; data-ke-size=&quot;size16&quot;&gt;위 코드는 다음과 같은 &lt;b&gt;DOM 트리&lt;/b&gt;를 생성해.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;html &lt;br /&gt;&amp;nbsp;├──&amp;nbsp;head &lt;br /&gt;&amp;nbsp;├──&amp;nbsp;body &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;h1#title &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;p.text &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;p.text &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;button#btn&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;797&quot; data-start=&quot;750&quot; data-ke-size=&quot;size16&quot;&gt;이제 JavaScript를 사용해서 &lt;b&gt;DOM을 조작하는 방법&lt;/b&gt;을 자세히 살펴볼게.&lt;/p&gt;
&lt;hr data-end=&quot;802&quot; data-start=&quot;799&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;824&quot; data-start=&quot;804&quot;&gt;&lt;b&gt;2. DOM 요소 선택하기&lt;/b&gt;&lt;/h1&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1109&quot; data-start=&quot;872&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1109&quot; data-start=&quot;903&quot;&gt;
&lt;tr data-end=&quot;948&quot; data-start=&quot;903&quot;&gt;
&lt;td&gt;getElementById(id)&lt;/td&gt;
&lt;td&gt;특정 ID를 가진 요소 하나 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1006&quot; data-start=&quot;949&quot;&gt;
&lt;td&gt;getElementsByClassName(class)&lt;/td&gt;
&lt;td&gt;특정 클래스를 가진 모든 요소 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1057&quot; data-start=&quot;1007&quot;&gt;
&lt;td&gt;querySelector(선택자)&lt;/td&gt;
&lt;td&gt;특정 선택자와 일치하는 첫 번째 요소 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1109&quot; data-start=&quot;1058&quot;&gt;
&lt;td&gt;querySelectorAll(선택자)&lt;/td&gt;
&lt;td&gt;특정 선택자와 일치하는 모든 요소 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-end=&quot;1114&quot; data-start=&quot;1111&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1144&quot; data-start=&quot;1116&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2-1. getElementById()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1180&quot; data-start=&quot;1145&quot; data-ke-size=&quot;size16&quot;&gt;이 메서드는 &lt;b&gt;ID 속성이 일치하는 요소를 하나만 반환&lt;/b&gt;해.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;title&amp;nbsp;=&amp;nbsp;document.getElementById(&quot;title&quot;); &lt;br /&gt;console.log(title);&amp;nbsp;//&amp;nbsp;&amp;lt;h1&amp;nbsp;id=&quot;title&quot;&amp;gt;안녕하세요!&amp;lt;/h1&amp;gt; &lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;1393&quot; data-start=&quot;1289&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1393&quot; data-start=&quot;1291&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주의:&lt;/b&gt; getElementById()는 &lt;b&gt;항상 하나의 요소만 반환&lt;/b&gt;해.&lt;br /&gt;HTML에서 id는 &lt;b&gt;고유해야 하므로&lt;/b&gt; 여러 개가 있을 경우 첫 번째 것만 가져와.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;1411&quot; data-start=&quot;1395&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;속성 변경 예제&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;title&amp;nbsp;=&amp;nbsp;document.getElementById(&quot;title&quot;); &lt;br /&gt;title.textContent&amp;nbsp;=&amp;nbsp;&quot;안녕하세요!&amp;nbsp;(변경됨)&quot;;&amp;nbsp;//&amp;nbsp;텍스트&amp;nbsp;변경 &lt;br /&gt;title.style.color&amp;nbsp;=&amp;nbsp;&quot;red&quot;;&amp;nbsp;//&amp;nbsp;글자색&amp;nbsp;변경 &lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1561&quot; data-start=&quot;1552&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과:&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;lt;h1&amp;nbsp;id=&quot;title&quot;&amp;nbsp;style=&quot;color:&amp;nbsp;red;&quot;&amp;gt;안녕하세요!&amp;nbsp;(변경됨)&amp;lt;/h1&amp;gt; &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1631&quot; data-start=&quot;1628&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1669&quot; data-start=&quot;1633&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2-2. getElementsByClassName()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1768&quot; data-start=&quot;1670&quot; data-ke-size=&quot;size16&quot;&gt;이 메서드는 &lt;b&gt;클래스 이름이 일치하는 모든 요소를 선택&lt;/b&gt;해.&lt;br /&gt;HTMLCollection(배열 같은 형태)을 반환하므로, 특정 요소를 선택하려면 인덱스를 사용해야 해.&lt;/p&gt;
&lt;p data-end=&quot;1768&quot; data-start=&quot;1670&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;paragraphs&amp;nbsp;=&amp;nbsp;document.getElementsByClassName(&quot;text&quot;); &lt;br /&gt;console.log(paragraphs);&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1919&quot; data-start=&quot;1865&quot; data-ke-size=&quot;size16&quot;&gt;위 코드를 실행하면 &lt;b&gt;두 개의 &amp;lt;p&amp;gt; 요소가 포함된 HTMLCollection&lt;/b&gt;이 출력돼.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;HTMLCollection&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&lt;span&gt;[p.text, p.text]&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1987&quot; data-start=&quot;1965&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;배열처럼 접근해서 변경하기&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;let&amp;nbsp;paragraphs&amp;nbsp;=&amp;nbsp;document.getElementsByClassName(&quot;text&quot;); &lt;br /&gt;paragraphs[0].textContent&amp;nbsp;=&amp;nbsp;&quot;첫&amp;nbsp;번째&amp;nbsp;문장이&amp;nbsp;변경되었습니다!&quot;; &lt;br /&gt;paragraphs[1].style.color&amp;nbsp;=&amp;nbsp;&quot;blue&quot;;&amp;nbsp;//&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;문장&amp;nbsp;색&amp;nbsp;변경 &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2161&quot; data-start=&quot;2158&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2190&quot; data-start=&quot;2163&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2-3. querySelector()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2257&quot; data-start=&quot;2191&quot; data-ke-size=&quot;size16&quot;&gt;이 메서드는 &lt;b&gt;CSS 선택자&lt;/b&gt;를 사용해서 요소를 찾을 수 있어.&lt;br /&gt;그리고 일치하는 &lt;b&gt;첫 번째 요소만 반환&lt;/b&gt;해.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;title&amp;nbsp;=&amp;nbsp;document.querySelector(&quot;#title&quot;);&amp;nbsp;//&amp;nbsp;ID&amp;nbsp;선택 &lt;br /&gt;let&amp;nbsp;firstParagraph&amp;nbsp;=&amp;nbsp;document.querySelector(&quot;.text&quot;);&amp;nbsp;//&amp;nbsp;클래스&amp;nbsp;선택 &lt;br /&gt;console.log(title,&amp;nbsp;firstParagraph); &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2442&quot; data-start=&quot;2425&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;스타일 변경 예제&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;firstParagraph&amp;nbsp;=&amp;nbsp;document.querySelector(&quot;.text&quot;); &lt;br /&gt;firstParagraph.style.fontWeight&amp;nbsp;=&amp;nbsp;&quot;bold&quot;;&amp;nbsp;//&amp;nbsp;글자&amp;nbsp;굵게 &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2562&quot; data-start=&quot;2559&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2594&quot; data-start=&quot;2564&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2-4. querySelectorAll()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2683&quot; data-start=&quot;2595&quot; data-ke-size=&quot;size16&quot;&gt;이 메서드는 querySelector()와 비슷하지만 &lt;b&gt;일치하는 모든 요소를 반환&lt;/b&gt;해.&lt;br /&gt;그리고 NodeList라는 배열과 유사한 객체를 반환해.&lt;/p&gt;
&lt;p data-end=&quot;2683&quot; data-start=&quot;2595&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;allParagraphs&amp;nbsp;=&amp;nbsp;document.querySelectorAll(&quot;.text&quot;); &lt;br /&gt;console.log(allParagraphs); &lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;2826&quot; data-start=&quot;2780&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2826&quot; data-start=&quot;2782&quot; data-ke-size=&quot;size16&quot;&gt;querySelectorAll()은 forEach()를 사용할 수 있어.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;2848&quot; data-start=&quot;2828&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;모든 요소 스타일 변경&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;document.querySelectorAll(&quot;.text&quot;).forEach(paragraph&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;paragraph.style.backgroundColor&amp;nbsp;=&amp;nbsp;&quot;yellow&quot;; &lt;br /&gt;}); &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2973&quot; data-start=&quot;2970&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2995&quot; data-start=&quot;2975&quot;&gt;&lt;b&gt;3. DOM 요소 조작하기&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;3023&quot; data-start=&quot;2996&quot; data-ke-size=&quot;size16&quot;&gt;선택한 요소를 어떻게 변경할 수 있는지 살펴보자.&lt;/p&gt;
&lt;hr data-end=&quot;3028&quot; data-start=&quot;3025&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3066&quot; data-start=&quot;3030&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3-1. textContent vs innerHTML&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3098&quot; data-start=&quot;3067&quot; data-ke-size=&quot;size16&quot;&gt;HTML 요소의 내용을 변경할 때 두 가지 방법이 있어.&lt;/p&gt;
속성설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3207&quot; data-start=&quot;3100&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3207&quot; data-start=&quot;3128&quot;&gt;
&lt;tr data-end=&quot;3166&quot; data-start=&quot;3128&quot;&gt;
&lt;td&gt;textContent&lt;/td&gt;
&lt;td&gt;요소 내부의 &lt;b&gt;텍스트&lt;/b&gt;를 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3207&quot; data-start=&quot;3167&quot;&gt;
&lt;td&gt;innerHTML&lt;/td&gt;
&lt;td&gt;요소 내부의 &lt;b&gt;HTML 코드&lt;/b&gt;를 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;title&amp;nbsp;=&amp;nbsp;document.getElementById(&quot;title&quot;); &lt;br /&gt;title.textContent&amp;nbsp;=&amp;nbsp;&quot;새로운&amp;nbsp;제목&quot;;&amp;nbsp;//&amp;nbsp;텍스트만&amp;nbsp;변경 &lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;let&amp;nbsp;firstParagraph&amp;nbsp;=&amp;nbsp;document.querySelector(&quot;.text&quot;); &lt;br /&gt;firstParagraph.innerHTML&amp;nbsp;=&amp;nbsp;&quot;&amp;lt;strong&amp;gt;굵은&amp;nbsp;글씨&amp;lt;/strong&amp;gt;&quot;; &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;3428&quot; data-start=&quot;3425&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3447&quot; data-start=&quot;3430&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3-2. 속성 변경&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3490&quot; data-start=&quot;3448&quot; data-ke-size=&quot;size16&quot;&gt;요소의 id, class, href 같은 속성을 변경할 수 있어.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;link&amp;nbsp;=&amp;nbsp;document.querySelector(&quot;a&quot;); &lt;br /&gt;link.href&amp;nbsp;=&amp;nbsp;&quot;&lt;a href=&quot;https://www.naver.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.naver.com&lt;/a&gt;&quot;;&amp;nbsp;//&amp;nbsp;링크&amp;nbsp;변경 &lt;br /&gt;link.target&amp;nbsp;=&amp;nbsp;&quot;_blank&quot;;&amp;nbsp;//&amp;nbsp;새&amp;nbsp;창에서&amp;nbsp;열기 &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3628&quot; data-start=&quot;3625&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3651&quot; data-start=&quot;3630&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3-3. 새로운 요소 추가&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3734&quot; data-start=&quot;3652&quot; data-ke-size=&quot;size16&quot;&gt;createElement(), appendChild(), insertBefore()를 사용해서 HTML 요소를 동적으로 추가할 수 있어.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;let&amp;nbsp;newParagraph&amp;nbsp;=&amp;nbsp;document.createElement(&quot;p&quot;);&amp;nbsp;//&amp;nbsp;새로운&amp;nbsp;&amp;lt;p&amp;gt;&amp;nbsp;요소&amp;nbsp;생성 &lt;br /&gt;newParagraph.textContent&amp;nbsp;=&amp;nbsp;&quot;새로&amp;nbsp;추가된&amp;nbsp;문장입니다!&quot;;&amp;nbsp;//&amp;nbsp;텍스트&amp;nbsp;추가 &lt;br /&gt;&lt;br /&gt;document.body.appendChild(newParagraph);&amp;nbsp;//&amp;nbsp;&amp;lt;body&amp;gt;의&amp;nbsp;마지막에&amp;nbsp;추가 &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3930&quot; data-start=&quot;3927&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3949&quot; data-start=&quot;3932&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3-4. 요소 삭제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3999&quot; data-start=&quot;3950&quot; data-ke-size=&quot;size16&quot;&gt;remove() 또는 removeChild()를 사용해서 요소를 삭제할 수 있어.&lt;/p&gt;
&lt;p data-end=&quot;3999&quot; data-start=&quot;3950&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;title&amp;nbsp;=&amp;nbsp;document.getElementById(&quot;title&quot;); &lt;br /&gt;title.remove();&amp;nbsp;//&amp;nbsp;제목&amp;nbsp;삭제 &lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4100&quot; data-start=&quot;4083&quot; data-ke-size=&quot;size16&quot;&gt;또는 부모 요소에서 제거 가능.&lt;/p&gt;
&lt;p data-end=&quot;4100&quot; data-start=&quot;4083&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;list&amp;nbsp;=&amp;nbsp;document.getElementById(&quot;taskList&quot;); &lt;br /&gt;let&amp;nbsp;firstTask&amp;nbsp;=&amp;nbsp;list.firstElementChild; &lt;br /&gt;list.removeChild(firstTask);&amp;nbsp;//&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;리스트&amp;nbsp;항목&amp;nbsp;삭제 &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;4251&quot; data-start=&quot;4248&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4283&quot; data-start=&quot;4253&quot;&gt;&lt;b&gt;4. 실전 예제: 버튼 클릭 시 텍스트 변경&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;4326&quot; data-start=&quot;4284&quot; data-ke-size=&quot;size16&quot;&gt;이제 실전 예제로 &lt;b&gt;버튼을 클릭하면 제목을 변경하는 코드&lt;/b&gt;를 작성해보자.&lt;/p&gt;
&lt;h2 data-end=&quot;4339&quot; data-start=&quot;4328&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;HTML&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;h1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;id&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;원래 제목&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;h1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;button&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;id&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;changeBtn&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;제목 변경&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;button&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;4434&quot; data-start=&quot;4417&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;JavaScript&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;document&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;changeBtn&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;click&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span&gt;function&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;) { &lt;/span&gt;&lt;span&gt;&lt;span&gt;document&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;&lt;span&gt;textContent&lt;/span&gt;&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;변경된 제목!&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; }); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;4787&quot; data-start=&quot;4588&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;4599&quot; data-start=&quot;4590&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;4787&quot; data-start=&quot;4602&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;4645&quot; data-start=&quot;4602&quot;&gt;getElementById(&quot;changeBtn&quot;) &amp;rarr; 버튼을 선택&lt;/li&gt;
&lt;li data-end=&quot;4712&quot; data-start=&quot;4648&quot;&gt;addEventListener(&quot;click&quot;, function() { ... }) &amp;rarr; 클릭 이벤트 추가&lt;/li&gt;
&lt;li data-end=&quot;4787&quot; data-start=&quot;4715&quot;&gt;document.getElementById(&quot;title&quot;).textContent = &quot;변경된 제목!&quot;; &amp;rarr; 제목 변경&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3504&quot; data-start=&quot;3501&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3525&quot; data-start=&quot;3506&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3-6. 이벤트 핸들링&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3570&quot; data-start=&quot;3526&quot; data-ke-size=&quot;size16&quot;&gt;JS에서 사용자의 &lt;b&gt;클릭, 키 입력, 마우스 움직임 등&lt;/b&gt;을 감지할 수 있어.&lt;/p&gt;
&lt;h3 data-end=&quot;3598&quot; data-start=&quot;3572&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) onclick 속성 사용&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;button&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;onclick&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;alert('버튼이 클릭됨!')&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;클릭&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;button&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3692&quot; data-start=&quot;3660&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) addEventListener 사용&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;document&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;btn&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;click&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span&gt;function&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;) { &lt;/span&gt;&lt;span&gt;&lt;span&gt;alert&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;이벤트 리스너 사용!&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;); }); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3845&quot; data-start=&quot;3804&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) mouseenter, mouseleave 이벤트&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;document&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;box&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;mouseenter&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span&gt;function&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;) { &lt;/span&gt;&lt;span&gt;&lt;span&gt;console&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;span&gt;log&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;마우스 들어옴!&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;); }); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3968&quot; data-start=&quot;3965&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4004&quot; data-start=&quot;3970&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3-7. 비동기 처리 (fetch &amp;amp; axios)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;4036&quot; data-start=&quot;4005&quot; data-ke-size=&quot;size16&quot;&gt;JS에서 데이터를 비동기적으로 가져오는 방법을 알아보자.&lt;/p&gt;
&lt;h3 data-end=&quot;4057&quot; data-start=&quot;4038&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) fetch 사용&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;fetch(&quot;&lt;a href=&quot;https://jsonplaceholder.typicode.com/posts/1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jsonplaceholder.typicode.com/posts/1&lt;/a&gt;&quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(response&amp;nbsp;=&amp;gt;&amp;nbsp;response.json()) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(data&amp;nbsp;=&amp;gt;&amp;nbsp;console.log(data)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch(error&amp;nbsp;=&amp;gt;&amp;nbsp;console.error(&quot;에러&amp;nbsp;발생:&quot;,&amp;nbsp;error)); &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;4271&quot; data-start=&quot;4252&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) axios 사용&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;axios.get(&quot;&lt;a href=&quot;https://jsonplaceholder.typicode.com/posts/1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jsonplaceholder.typicode.com/posts/1&lt;/a&gt;&quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(response&amp;nbsp;=&amp;gt;&amp;nbsp;console.log(response.data)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch(error&amp;nbsp;=&amp;gt;&amp;nbsp;console.error(&quot;에러&amp;nbsp;발생:&quot;,&amp;nbsp;error)); &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;4447&quot; data-start=&quot;4444&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4478&quot; data-start=&quot;4449&quot;&gt;&lt;b&gt;실전 예제: HTML, CSS, JS 연동&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;4520&quot; data-start=&quot;4479&quot; data-ke-size=&quot;size16&quot;&gt;지금까지 배운 내용을 모두 조합해서 &lt;b&gt;완전한 웹 페이지&lt;/b&gt;를 만들어보자.&lt;/p&gt;
&lt;h3 data-end=&quot;4540&quot; data-start=&quot;4522&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) HTML 코드&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;gt; &lt;br /&gt;&amp;lt;html&amp;nbsp;lang=&quot;ko&quot;&amp;gt; &lt;br /&gt;&amp;lt;head&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;meta&amp;nbsp;charset=&quot;UTF-8&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;JavaScript&amp;nbsp;예제&amp;lt;/title&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;link&amp;nbsp;rel=&quot;stylesheet&quot;&amp;nbsp;href=&quot;styles.css&quot;&amp;gt; &lt;br /&gt;&amp;lt;/head&amp;gt; &lt;br /&gt;&amp;lt;body&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;nbsp;id=&quot;title&quot;&amp;gt;안녕하세요!&amp;lt;/h1&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;button&amp;nbsp;id=&quot;btn&quot;&amp;gt;버튼&amp;nbsp;클릭&amp;lt;/button&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;nbsp;id=&quot;text&quot;&amp;gt;이&amp;nbsp;문장을&amp;nbsp;변경합니다.&amp;lt;/p&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;script&amp;nbsp;src=&quot;script.js&quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;/body&amp;gt; &lt;br /&gt;&amp;lt;/html&amp;gt; &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;4887&quot; data-start=&quot;4870&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) CSS 코드&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;body&amp;nbsp;{&amp;nbsp;font-family:&amp;nbsp;Arial,&amp;nbsp;sans-serif;&amp;nbsp;text-align:&amp;nbsp;center;&amp;nbsp;} &lt;br /&gt;button&amp;nbsp;{&amp;nbsp;padding:&amp;nbsp;10px;&amp;nbsp;background-color:&amp;nbsp;blue;&amp;nbsp;color:&amp;nbsp;white;&amp;nbsp;} &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;5041&quot; data-start=&quot;5025&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) JS 코드&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;document.getElementById(&quot;btn&quot;).addEventListener(&quot;click&quot;,&amp;nbsp;function()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.getElementById(&quot;text&quot;).textContent&amp;nbsp;=&amp;nbsp;&quot;텍스트가&amp;nbsp;변경됨!&quot;; &lt;br /&gt;}); &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;120&quot; data-start=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;지금까지 JavaScript의 기본 문법과 DOM 조작, 이벤트 핸들링을 배웠다면 이제는 &lt;b&gt;고급 기능&lt;/b&gt;을 다루면서 더 깊이 있는 내용을 다룰 거야.&lt;/p&gt;
&lt;hr data-end=&quot;125&quot; data-start=&quot;122&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;171&quot; data-start=&quot;127&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4-1. 고급 함수 (Higher Order Functions)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;250&quot; data-start=&quot;172&quot; data-ke-size=&quot;size16&quot;&gt;JavaScript에서는 함수를 인자로 받거나 반환할 수 있는 &lt;b&gt;고차 함수&lt;/b&gt;(Higher Order Function)를 사용할 수 있어.&lt;/p&gt;
&lt;h3 data-end=&quot;288&quot; data-start=&quot;252&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 콜백 함수 (Callback Function)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;329&quot; data-start=&quot;289&quot; data-ke-size=&quot;size16&quot;&gt;콜백 함수는 &lt;b&gt;다른 함수의 인자로 전달되어 실행되는 함수&lt;/b&gt;를 의미해.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;function&amp;nbsp;greet(name,&amp;nbsp;callback)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;안녕하세요,&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;name&amp;nbsp;+&amp;nbsp;&quot;님!&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;callback(); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;function&amp;nbsp;sayBye()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;잘&amp;nbsp;가세요!&quot;); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;greet(&quot;철수&quot;,&amp;nbsp;sayBye); &lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;542&quot; data-start=&quot;506&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;542&quot; data-start=&quot;508&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;출력:&lt;/b&gt;&lt;br /&gt;안녕하세요, 철수님!&lt;br /&gt;잘 가세요!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;547&quot; data-start=&quot;544&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;569&quot; data-start=&quot;549&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 배열의 고차 함수&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;570&quot; data-ke-size=&quot;size16&quot;&gt;JavaScript에서 배열을 다룰 때 map, filter, reduce 같은 고차 함수를 많이 사용해.&lt;/p&gt;
&lt;h4 data-end=&quot;678&quot; data-start=&quot;637&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(1) map()&lt;/b&gt; - 배열 요소를 변형하여 새 배열을 반환&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;numbers&amp;nbsp;=&amp;nbsp;[1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;5]; &lt;br /&gt;let&amp;nbsp;squared&amp;nbsp;=&amp;nbsp;numbers.map(num&amp;nbsp;=&amp;gt;&amp;nbsp;num&amp;nbsp;**&amp;nbsp;2); &lt;br /&gt;console.log(squared);&amp;nbsp;//&amp;nbsp;[1,&amp;nbsp;4,&amp;nbsp;9,&amp;nbsp;16,&amp;nbsp;25] &lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;851&quot; data-start=&quot;808&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(2) filter()&lt;/b&gt; - 특정 조건을 만족하는 요소만 필터링&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;evenNumbers&amp;nbsp;=&amp;nbsp;numbers.filter(num&amp;nbsp;=&amp;gt;&amp;nbsp;num&amp;nbsp;%&amp;nbsp;2&amp;nbsp;===&amp;nbsp;0); &lt;br /&gt;console.log(evenNumbers);&amp;nbsp;//&amp;nbsp;[2,&amp;nbsp;4] &lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;996&quot; data-start=&quot;955&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(3) reduce()&lt;/b&gt; - 배열 요소를 하나의 값으로 축약&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;sum&amp;nbsp;=&amp;nbsp;numbers.reduce((acc,&amp;nbsp;cur)&amp;nbsp;=&amp;gt;&amp;nbsp;acc&amp;nbsp;+&amp;nbsp;cur,&amp;nbsp;0); &lt;br /&gt;console.log(sum);&amp;nbsp;//&amp;nbsp;15 &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1089&quot; data-start=&quot;1086&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1135&quot; data-start=&quot;1091&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4-2. 비동기 처리 (Asynchronous JavaScript)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1200&quot; data-start=&quot;1136&quot; data-ke-size=&quot;size16&quot;&gt;비동기 처리는 JavaScript에서 데이터를 서버에서 가져오거나, 일정 시간이 지난 후 작업을 실행할 때 사용돼.&lt;/p&gt;
&lt;h3 data-end=&quot;1237&quot; data-start=&quot;1202&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) setTimeout &amp;amp; setInterval&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;setTimeout(()&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;3초&amp;nbsp;후&amp;nbsp;실행!&quot;); &lt;br /&gt;},&amp;nbsp;3000); &lt;br /&gt;&lt;br /&gt;let&amp;nbsp;count&amp;nbsp;=&amp;nbsp;0; &lt;br /&gt;let&amp;nbsp;interval&amp;nbsp;=&amp;nbsp;setInterval(()&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;1초마다&amp;nbsp;실행!&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;count); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count++; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(count&amp;nbsp;===&amp;nbsp;5)&amp;nbsp;clearInterval(interval);&amp;nbsp;//&amp;nbsp;5번&amp;nbsp;실행&amp;nbsp;후&amp;nbsp;멈춤 &lt;br /&gt;},&amp;nbsp;1000); &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1482&quot; data-start=&quot;1479&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1509&quot; data-start=&quot;1484&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 프로미스 (Promise)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1573&quot; data-start=&quot;1510&quot; data-ke-size=&quot;size16&quot;&gt;Promise는 비동기 작업이 성공했을 때 .then(), 실패했을 때 .catch()를 실행할 수 있어.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;let&amp;nbsp;fetchData&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Promise((resolve,&amp;nbsp;reject)&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setTimeout(()&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resolve(&quot;데이터를&amp;nbsp;가져왔습니다!&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&amp;nbsp;2000); &lt;br /&gt;}); &lt;br /&gt;&lt;br /&gt;fetchData.then(result&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(result); &lt;br /&gt;}).catch(error&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.error(&quot;에러&amp;nbsp;발생:&quot;,&amp;nbsp;error); &lt;br /&gt;}); &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1827&quot; data-start=&quot;1824&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1853&quot; data-start=&quot;1829&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) async / await&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1910&quot; data-start=&quot;1854&quot; data-ke-size=&quot;size16&quot;&gt;async 함수 안에서 await을 사용하면 &lt;b&gt;비동기 작업을 동기적으로 실행&lt;/b&gt;할 수 있어.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;async&amp;nbsp;function&amp;nbsp;getData()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;response&amp;nbsp;=&amp;nbsp;await&amp;nbsp;fetch(&quot;&lt;a href=&quot;https://jsonplaceholder.typicode.com/todos/1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jsonplaceholder.typicode.com/todos/1&lt;/a&gt;&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;data&amp;nbsp;=&amp;nbsp;await&amp;nbsp;response.json(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(data); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(error)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.error(&quot;데이터를&amp;nbsp;가져오는데&amp;nbsp;실패했습니다.&quot;,&amp;nbsp;error); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;getData(); &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2210&quot; data-start=&quot;2207&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2242&quot; data-start=&quot;2212&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4-3. JavaScript와 웹 스토리지&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2276&quot; data-start=&quot;2243&quot; data-ke-size=&quot;size16&quot;&gt;웹 스토리지를 사용하면 브라우저에 데이터를 저장할 수 있어.&lt;/p&gt;
&lt;h3 data-end=&quot;2309&quot; data-start=&quot;2278&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) LocalStorage (영구 저장)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;localStorage.setItem(&quot;username&quot;,&amp;nbsp;&quot;철수&quot;); &lt;br /&gt;console.log(localStorage.getItem(&quot;username&quot;));&amp;nbsp;//&amp;nbsp;&quot;철수&quot; &lt;br /&gt;localStorage.removeItem(&quot;username&quot;); &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2490&quot; data-start=&quot;2453&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) SessionStorage (세션 동안만 저장)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;sessionStorage.setItem(&quot;sessionData&quot;,&amp;nbsp;&quot;임시&amp;nbsp;데이터&quot;); &lt;br /&gt;console.log(sessionStorage.getItem(&quot;sessionData&quot;)); &lt;br /&gt;sessionStorage.removeItem(&quot;sessionData&quot;); &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2648&quot; data-start=&quot;2645&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2679&quot; data-start=&quot;2650&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4-4. AJAX (비동기 데이터 요청)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2727&quot; data-start=&quot;2680&quot; data-ke-size=&quot;size16&quot;&gt;AJAX를 사용하면 웹 페이지를 새로고침하지 않고 서버에서 데이터를 가져올 수 있어.&lt;/p&gt;
&lt;h3 data-end=&quot;2752&quot; data-start=&quot;2729&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) fetch API 사용&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;fetch(&quot;&lt;a href=&quot;https://jsonplaceholder.typicode.com/posts/1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jsonplaceholder.typicode.com/posts/1&lt;/a&gt;&quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(response&amp;nbsp;=&amp;gt;&amp;nbsp;response.json()) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(data&amp;nbsp;=&amp;gt;&amp;nbsp;console.log(data)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch(error&amp;nbsp;=&amp;gt;&amp;nbsp;console.error(&quot;에러&amp;nbsp;발생:&quot;,&amp;nbsp;error)); &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2966&quot; data-start=&quot;2947&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) axios 사용&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;axios.get(&quot;&lt;a href=&quot;https://jsonplaceholder.typicode.com/posts/1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jsonplaceholder.typicode.com/posts/1&lt;/a&gt;&quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(response&amp;nbsp;=&amp;gt;&amp;nbsp;console.log(response.data)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch(error&amp;nbsp;=&amp;gt;&amp;nbsp;console.error(&quot;에러&amp;nbsp;발생:&quot;,&amp;nbsp;error)); &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3142&quot; data-start=&quot;3139&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3173&quot; data-start=&quot;3144&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4-5. JavaScript 이벤트 심화&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3197&quot; data-start=&quot;3174&quot; data-ke-size=&quot;size16&quot;&gt;이제 다양한 이벤트 처리 방법을 알아볼게.&lt;/p&gt;
&lt;h3 data-end=&quot;3223&quot; data-start=&quot;3199&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 이벤트 리스너 추가 방법&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;document.getElementById(&quot;myButton&quot;).addEventListener(&quot;click&quot;,&amp;nbsp;function()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(&quot;버튼&amp;nbsp;클릭됨!&quot;); &lt;br /&gt;}); &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3361&quot; data-start=&quot;3336&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 여러 이벤트 한 번에 추가&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;function&amp;nbsp;handleEvent(event)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(event.type&amp;nbsp;+&amp;nbsp;&quot;&amp;nbsp;이벤트&amp;nbsp;발생!&quot;); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;let&amp;nbsp;button&amp;nbsp;=&amp;nbsp;document.getElementById(&quot;btn&quot;); &lt;br /&gt;button.addEventListener(&quot;mouseenter&quot;,&amp;nbsp;handleEvent); &lt;br /&gt;button.addEventListener(&quot;mouseleave&quot;,&amp;nbsp;handleEvent); &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3615&quot; data-start=&quot;3597&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) 키보드 이벤트&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;document.addEventListener(&quot;keydown&quot;,&amp;nbsp;function(event)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;키&amp;nbsp;누름:&quot;,&amp;nbsp;event.key); &lt;br /&gt;}); &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3742&quot; data-start=&quot;3723&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) 폼 제출 이벤트&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;document.getElementById(&quot;form&quot;).addEventListener(&quot;submit&quot;,&amp;nbsp;function(event)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;event.preventDefault();&amp;nbsp;//&amp;nbsp;기본&amp;nbsp;동작&amp;nbsp;방지 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;폼&amp;nbsp;제출됨!&quot;); &lt;br /&gt;}); &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3905&quot; data-start=&quot;3902&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3938&quot; data-start=&quot;3907&quot;&gt;&lt;b&gt;실전 프로젝트: HTML, CSS, JS 통합&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;3995&quot; data-start=&quot;3939&quot; data-ke-size=&quot;size16&quot;&gt;지금까지 배운 내용을 활용하여 간단한 &lt;b&gt;할 일 목록 (To-Do List)&lt;/b&gt; 웹 앱을 만들어보자.&lt;/p&gt;
&lt;hr data-end=&quot;4000&quot; data-start=&quot;3997&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4019&quot; data-start=&quot;4002&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) HTML 코드&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;gt; &lt;br /&gt;&amp;lt;html&amp;nbsp;lang=&quot;ko&quot;&amp;gt; &lt;br /&gt;&amp;lt;head&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;meta&amp;nbsp;charset=&quot;UTF-8&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;To-Do&amp;nbsp;List&amp;lt;/title&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;link&amp;nbsp;rel=&quot;stylesheet&quot;&amp;nbsp;href=&quot;styles.css&quot;&amp;gt; &lt;br /&gt;&amp;lt;/head&amp;gt; &lt;br /&gt;&amp;lt;body&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;To-Do&amp;nbsp;List&amp;lt;/h1&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input&amp;nbsp;type=&quot;text&quot;&amp;nbsp;id=&quot;taskInput&quot;&amp;nbsp;placeholder=&quot;할&amp;nbsp;일&amp;nbsp;입력&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;button&amp;nbsp;id=&quot;addTask&quot;&amp;gt;추가&amp;lt;/button&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ul&amp;nbsp;id=&quot;taskList&quot;&amp;gt;&amp;lt;/ul&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;script&amp;nbsp;src=&quot;script.js&quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;/body&amp;gt; &lt;br /&gt;&amp;lt;/html&amp;gt; &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;4397&quot; data-start=&quot;4394&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4415&quot; data-start=&quot;4399&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2) CSS 코드&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;body&amp;nbsp;{&amp;nbsp;font-family:&amp;nbsp;Arial,&amp;nbsp;sans-serif;&amp;nbsp;text-align:&amp;nbsp;center;&amp;nbsp;} &lt;br /&gt;button&amp;nbsp;{&amp;nbsp;padding:&amp;nbsp;10px;&amp;nbsp;background-color:&amp;nbsp;green;&amp;nbsp;color:&amp;nbsp;white;&amp;nbsp;} &lt;br /&gt;ul&amp;nbsp;{&amp;nbsp;list-style:&amp;nbsp;none;&amp;nbsp;padding:&amp;nbsp;0;&amp;nbsp;} &lt;br /&gt;li&amp;nbsp;{&amp;nbsp;padding:&amp;nbsp;5px;&amp;nbsp;background:&amp;nbsp;lightgray;&amp;nbsp;margin:&amp;nbsp;5px;&amp;nbsp;cursor:&amp;nbsp;pointer;&amp;nbsp;} &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;4668&quot; data-start=&quot;4665&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4693&quot; data-start=&quot;4670&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3) JavaScript 코드&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;document.getElementById(&quot;addTask&quot;).addEventListener(&quot;click&quot;,&amp;nbsp;function()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;taskInput&amp;nbsp;=&amp;nbsp;document.getElementById(&quot;taskInput&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;taskText&amp;nbsp;=&amp;nbsp;taskInput.value; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(taskText.trim()&amp;nbsp;===&amp;nbsp;&quot;&quot;)&amp;nbsp;return; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;li&amp;nbsp;=&amp;nbsp;document.createElement(&quot;li&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;li.textContent&amp;nbsp;=&amp;nbsp;taskText; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;li.addEventListener(&quot;click&quot;,&amp;nbsp;function()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;li.remove();&amp;nbsp;//&amp;nbsp;클릭하면&amp;nbsp;삭제 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.getElementById(&quot;taskList&quot;).appendChild(li); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;taskInput.value&amp;nbsp;=&amp;nbsp;&quot;&quot;; &lt;br /&gt;}); &lt;/div&gt;
&lt;/div&gt;</description>
      <category>개발 이론/WEB</category>
      <category>CSS</category>
      <category>html</category>
      <category>js</category>
      <author>jeonghoe21</author>
      <guid isPermaLink="true">https://jeonghoe21.tistory.com/26</guid>
      <comments>https://jeonghoe21.tistory.com/26#entry26comment</comments>
      <pubDate>Thu, 13 Mar 2025 03:00:47 +0900</pubDate>
    </item>
    <item>
      <title>Lambda</title>
      <link>https://jeonghoe21.tistory.com/25</link>
      <description>&lt;h2 data-end=&quot;266&quot; data-start=&quot;224&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1️⃣ 람다 표현식(Lambda Expression) 기본 문법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;289&quot; data-start=&quot;267&quot; data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;람다 표현식 기본 구조&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;(parameters) -&amp;gt; { statements } &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;355&quot; data-start=&quot;333&quot; data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;람다 표현식 주요 특징&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;522&quot; data-start=&quot;356&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;416&quot; data-start=&quot;356&quot;&gt;&lt;b&gt;익명 함수(Anonymous Function)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;416&quot; data-start=&quot;392&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;416&quot; data-start=&quot;392&quot;&gt;별도로 이름이 없는 함수를 선언하는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;449&quot; data-start=&quot;417&quot;&gt;&lt;b&gt;간결한 문법&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;449&quot; data-start=&quot;434&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;449&quot; data-start=&quot;434&quot;&gt;불필요한 코드 제거 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;522&quot; data-start=&quot;450&quot;&gt;&lt;b&gt;함수형 인터페이스와 함께 사용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;522&quot; data-start=&quot;477&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;522&quot; data-start=&quot;477&quot;&gt;FunctionalInterface를 구현하는 메서드를 간략하게 표현 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;527&quot; data-start=&quot;524&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;221&quot; data-start=&quot;173&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  Java 함수형 인터페이스(Functional Interface)란?&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;368&quot; data-start=&quot;222&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;262&quot; data-start=&quot;222&quot;&gt;Java에서 &lt;b&gt;람다 표현식&lt;/b&gt;을 사용할 때 필요한 인터페이스입니다.&lt;/li&gt;
&lt;li data-end=&quot;303&quot; data-start=&quot;263&quot;&gt;함수형 인터페이스는 &lt;b&gt;추상 메서드가 단 하나만 존재&lt;/b&gt;해야 합니다.&lt;/li&gt;
&lt;li data-end=&quot;368&quot; data-start=&quot;304&quot;&gt;@FunctionalInterface 어노테이션을 붙이면 해당 인터페이스가 함수형 인터페이스임을 보장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;392&quot; data-start=&quot;370&quot; data-ke-size=&quot;size23&quot;&gt;✅ 함수형 인터페이스의 주요 종류&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수형 인터페이스메서드설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;784&quot; data-start=&quot;393&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;784&quot; data-start=&quot;460&quot;&gt;
&lt;tr data-end=&quot;502&quot; data-start=&quot;460&quot;&gt;
&lt;td&gt;Runnable&lt;/td&gt;
&lt;td&gt;run()&lt;/td&gt;
&lt;td&gt;매개변수 없음, 반환값 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;548&quot; data-start=&quot;503&quot;&gt;
&lt;td&gt;Supplier&amp;lt;T&amp;gt;&lt;/td&gt;
&lt;td&gt;get()&lt;/td&gt;
&lt;td&gt;매개변수 없음, 반환값 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;600&quot; data-start=&quot;549&quot;&gt;
&lt;td&gt;Consumer&amp;lt;T&amp;gt;&lt;/td&gt;
&lt;td&gt;accept(T t)&lt;/td&gt;
&lt;td&gt;매개변수 있음, 반환값 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;653&quot; data-start=&quot;601&quot;&gt;
&lt;td&gt;Function&amp;lt;T, R&amp;gt;&lt;/td&gt;
&lt;td&gt;apply(T t)&lt;/td&gt;
&lt;td&gt;입력을 받아 변환 후 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;716&quot; data-start=&quot;654&quot;&gt;
&lt;td&gt;Predicate&amp;lt;T&amp;gt;&lt;/td&gt;
&lt;td&gt;test(T t)&lt;/td&gt;
&lt;td&gt;입력을 받아 true 또는 false 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;784&quot; data-start=&quot;717&quot;&gt;
&lt;td&gt;BiFunction&amp;lt;T, U, R&amp;gt;&lt;/td&gt;
&lt;td&gt;apply(T t, U u)&lt;/td&gt;
&lt;td&gt;두 개의 입력을 받아 변환 후 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-end=&quot;789&quot; data-start=&quot;786&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;822&quot; data-start=&quot;791&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1-1. Runnable - run()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;847&quot; data-start=&quot;823&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;매개변수 없음, 반환값 없음&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;885&quot; data-start=&quot;848&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;885&quot; data-start=&quot;848&quot;&gt;별도의 인자를 받지 않고 단순히 실행하는 작업을 정의할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;900&quot; data-start=&quot;887&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  예제&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;Runnable&lt;/span&gt; &lt;span&gt;r&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; () -&amp;gt; System.out.println(&lt;span&gt;&quot;Runnable 실행!&quot;&lt;/span&gt;); &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;r.run(); &lt;span&gt;// 출력: Runnable 실행!&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1024&quot; data-start=&quot;998&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  run() 메서드의 역할&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1063&quot; data-start=&quot;1025&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1048&quot; data-start=&quot;1025&quot;&gt;Runnable 인터페이스에서 제공&lt;/li&gt;
&lt;li data-end=&quot;1063&quot; data-start=&quot;1049&quot;&gt;스레드 실행 시 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1068&quot; data-start=&quot;1065&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1110&quot; data-start=&quot;1070&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1-2 Consumer&amp;lt;T&amp;gt; - accept(T t)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1135&quot; data-start=&quot;1111&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;매개변수 있음, 반환값 없음&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1170&quot; data-start=&quot;1136&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1170&quot; data-start=&quot;1136&quot;&gt;주어진 입력을 소비(사용)하고 반환값이 필요 없을 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1185&quot; data-start=&quot;1172&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  예제&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Consumer&amp;lt;String&amp;gt; consumer = name -&amp;gt; System.out.println(&lt;span&gt;&quot;Hello, &quot;&lt;/span&gt; + name); &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;consumer.accept(&lt;span&gt;&quot;Alice&quot;&lt;/span&gt;); &lt;span&gt;// 출력: Hello, Alice&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1351&quot; data-start=&quot;1319&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  accept(T t) 메서드의 역할&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1418&quot; data-start=&quot;1352&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1380&quot; data-start=&quot;1352&quot;&gt;입력을 받아서 처리하지만, 결과를 반환하지 않음&lt;/li&gt;
&lt;li data-end=&quot;1418&quot; data-start=&quot;1381&quot;&gt;System.out.println()처럼 출력하는 경우 유용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1423&quot; data-start=&quot;1420&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1467&quot; data-start=&quot;1425&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3️⃣ Function&amp;lt;T, R&amp;gt; - apply(T t)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1491&quot; data-start=&quot;1468&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;입력을 받아 변환 후 반환&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1521&quot; data-start=&quot;1492&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1521&quot; data-start=&quot;1492&quot;&gt;입력값을 받아 다른 타입으로 변환해야 할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1536&quot; data-start=&quot;1523&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  예제&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Function&amp;lt;Integer, String&amp;gt; function = num -&amp;gt; &lt;span&gt;&quot;숫자: &quot;&lt;/span&gt; + num; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(function.apply(&lt;span&gt;10&lt;/span&gt;)); &lt;span&gt;// 출력: 숫자: 10&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1693&quot; data-start=&quot;1662&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  apply(T t) 메서드의 역할&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1747&quot; data-start=&quot;1694&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1720&quot; data-start=&quot;1694&quot;&gt;입력을 받아서 변환 후 반환하는 작업을 수행&lt;/li&gt;
&lt;li data-end=&quot;1747&quot; data-start=&quot;1721&quot;&gt;스트림에서 map()과 함께 자주 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;List&amp;lt;Integer&amp;gt; numbers = Arrays.asList(&lt;span&gt;1&lt;/span&gt;, &lt;span&gt;2&lt;/span&gt;, &lt;span&gt;3&lt;/span&gt;, &lt;span&gt;4&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;List&amp;lt;String&amp;gt; stringNumbers = numbers.stream() &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .map(num -&amp;gt; &lt;span&gt;&quot;숫자: &quot;&lt;/span&gt; + num) &lt;span&gt;// Function&amp;lt;T, R&amp;gt; 적용&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .collect(Collectors.toList());&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(stringNumbers); &lt;span&gt;// 출력: [숫자: 1, 숫자: 2, 숫자: 3, 숫자: 4]&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2028&quot; data-start=&quot;2025&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2069&quot; data-start=&quot;2030&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4️⃣ Predicate&amp;lt;T&amp;gt; - test(T t)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2106&quot; data-start=&quot;2070&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;입력을 받아 true 또는 false 반환&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2124&quot; data-start=&quot;2107&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2124&quot; data-start=&quot;2107&quot;&gt;조건 검사를 수행할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2139&quot; data-start=&quot;2126&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  예제&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Predicate&amp;lt;Integer&amp;gt; isEven = num -&amp;gt; num % &lt;span&gt;2&lt;/span&gt; == &lt;span&gt;0&lt;/span&gt;; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(isEven.test(&lt;span&gt;4&lt;/span&gt;)); &lt;span&gt;// 출력: true&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(isEven.test(&lt;span&gt;5&lt;/span&gt;)); &lt;span&gt;// 출력: false&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2329&quot; data-start=&quot;2299&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  test(T t) 메서드의 역할&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2381&quot; data-start=&quot;2330&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2352&quot; data-start=&quot;2330&quot;&gt;입력값이 특정 조건을 만족하는지 검사&lt;/li&gt;
&lt;li data-end=&quot;2381&quot; data-start=&quot;2353&quot;&gt;스트림의 filter()와 함께 자주 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;List&amp;lt;Integer&amp;gt; evenNumbers = numbers.stream() &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .filter(num -&amp;gt; num % &lt;span&gt;2&lt;/span&gt; == &lt;span&gt;0&lt;/span&gt;) &lt;span&gt;// Predicate&amp;lt;T&amp;gt; 적용&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .collect(Collectors.toList()); &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(evenNumbers); &lt;span&gt;// 출력: [2, 4]&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2587&quot; data-start=&quot;2584&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2641&quot; data-start=&quot;2589&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5️⃣ BiFunction&amp;lt;T, U, R&amp;gt; - apply(T t, U u)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2670&quot; data-start=&quot;2642&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;두 개의 입력을 받아 변환 후 반환&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2701&quot; data-start=&quot;2671&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2701&quot; data-start=&quot;2671&quot;&gt;두 개의 값을 입력받아 결과를 반환해야 할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2716&quot; data-start=&quot;2703&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  예제&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;BiFunction&amp;lt;Integer, Integer, Integer&amp;gt; sum = (a, b) -&lt;/span&gt;&lt;span&gt;&amp;gt; a + b; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(sum.apply(&lt;span&gt;3&lt;/span&gt;, &lt;span&gt;5&lt;/span&gt;)); &lt;span&gt;// 출력: 8&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2873&quot; data-start=&quot;2837&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  apply(T t, U u) 메서드의 역할&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2928&quot; data-start=&quot;2874&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2898&quot; data-start=&quot;2874&quot;&gt;두 개의 입력을 받아 하나의 결과를 반환&lt;/li&gt;
&lt;li data-end=&quot;2928&quot; data-start=&quot;2899&quot;&gt;map()과 함께 복합 변환을 수행할 때 유용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2933&quot; data-start=&quot;2930&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2969&quot; data-start=&quot;2935&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6️⃣ Supplier&amp;lt;T&amp;gt; - get()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2992&quot; data-start=&quot;2970&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;매개변수 없이 값을 반환&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3008&quot; data-start=&quot;2993&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3008&quot; data-start=&quot;2993&quot;&gt;값을 제공하는 역할을 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;3023&quot; data-start=&quot;3010&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  예제&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;Supplier&amp;lt;Double&amp;gt; randomSupplier = () -&amp;gt; Math.random(); &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(randomSupplier.get()); &lt;span&gt;// 랜덤 값 출력&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3171&quot; data-start=&quot;3145&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  get() 메서드의 역할&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3238&quot; data-start=&quot;3172&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3201&quot; data-start=&quot;3172&quot;&gt;외부에서 값을 받아오지 않고 생성해야 할 때 사용&lt;/li&gt;
&lt;li data-end=&quot;3238&quot; data-start=&quot;3202&quot;&gt;지연 초기화(lazy initialization)에 활용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;552&quot; data-start=&quot;529&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;552&quot; data-start=&quot;529&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;552&quot; data-start=&quot;529&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2️⃣ 람다 표현식 활용 예제&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;575&quot; data-start=&quot;553&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 기본적인 람다 표현식&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1741012657628&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 매개변수가 없는 경우
Runnable r = () -&amp;gt; System.out.println(&quot;Hello, Lambda!&quot;);
r.run();

// 2. 매개변수가 하나인 경우
Consumer&amp;lt;String&amp;gt; consumer = name -&amp;gt; System.out.println(&quot;Hello, &quot; + name);
consumer.accept(&quot;Alice&quot;);

// 3. 매개변수가 여러 개인 경우
BiFunction&amp;lt;Integer, Integer, Integer&amp;gt; sum = (a, b) -&amp;gt; a + b;
System.out.println(sum.apply(3, 5)); // 출력: 8

// 4. 코드 블록이 있는 경우
BiConsumer&amp;lt;String, Integer&amp;gt; printer = (name, age) -&amp;gt; {
    System.out.println(&quot;이름: &quot; + name);
    System.out.println(&quot;나이: &quot; + age);
};
printer.accept(&quot;Alice&quot;, 25);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;1109&quot; data-start=&quot;1106&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1141&quot; data-start=&quot;1111&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3️⃣ Java Stream과 람다 표현식&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1217&quot; data-start=&quot;1142&quot; data-ke-size=&quot;size16&quot;&gt;Java &lt;b&gt;Stream API&lt;/b&gt;는 &lt;b&gt;컬렉션(List, Set, Map) 데이터를 함수형 스타일로 조작&lt;/b&gt;할 수 있도록 도와줍니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1238&quot; data-start=&quot;1219&quot; data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;스트림 기본 구조&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;collection.stream() &lt;span&gt;// 컬렉션에서 스트림 생성&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt;filter(조건) &lt;span&gt;// 특정 조건을 만족하는 요소만 필터링&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .map(변환) &lt;span&gt;// 요소 변환&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .sorted() &lt;span&gt;// 정렬&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .collect(Collectors.toList()); &lt;span&gt;// 리스트로 변환&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1433&quot; data-start=&quot;1430&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1469&quot; data-start=&quot;1435&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4️⃣ filter()를 이용한 데이터 필터링&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1514&quot; data-start=&quot;1470&quot; data-ke-size=&quot;size16&quot;&gt;  filter()는 특정 조건을 만족하는 요소만 추출하는 기능을 합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1542&quot; data-start=&quot;1516&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예제 1: 리스트에서 짝수만 추출&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;List&amp;lt;Integer&amp;gt; numbers = Arrays.asList(&lt;span&gt;1&lt;/span&gt;, &lt;span&gt;2&lt;/span&gt;, &lt;span&gt;3&lt;/span&gt;, &lt;span&gt;4&lt;/span&gt;, &lt;span&gt;5&lt;/span&gt;, &lt;span&gt;6&lt;/span&gt;, &lt;span&gt;7&lt;/span&gt;, &lt;span&gt;8&lt;/span&gt;, &lt;span&gt;9&lt;/span&gt;, &lt;span&gt;10&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;List&amp;lt;Integer&amp;gt; evenNumbers = numbers.stream() &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .filter(num -&amp;gt; num % &lt;span&gt;2&lt;/span&gt; == &lt;span&gt;0&lt;/span&gt;) &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .collect(Collectors.toList()); &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(evenNumbers); &lt;span&gt;// 출력: [2, 4, 6, 8, 10]&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1845&quot; data-start=&quot;1806&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예제 2: 이름 리스트에서 &quot;A&quot;로 시작하는 이름 필터링&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;List&amp;lt;String&amp;gt; names = Arrays.asList(&lt;span&gt;&quot;Alice&quot;&lt;/span&gt;, &lt;span&gt;&quot;Bob&quot;&lt;/span&gt;, &lt;span&gt;&quot;Andrew&quot;&lt;/span&gt;, &lt;span&gt;&quot;Charlie&quot;&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;List&amp;lt;String&amp;gt; filteredNames = names.stream() &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .filter(name -&amp;gt; name.startsWith(&lt;span&gt;&quot;A&quot;&lt;/span&gt;)) &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .collect(Collectors.toList()); &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(filteredNames); &lt;span&gt;// 출력: [Alice, Andrew]&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2124&quot; data-start=&quot;2121&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2156&quot; data-start=&quot;2126&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5️⃣ map()을 이용한 데이터 변환&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2207&quot; data-start=&quot;2157&quot; data-ke-size=&quot;size16&quot;&gt;  map()은 스트림의 각 요소를 변환하여 새로운 스트림을 생성하는 기능을 합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;2239&quot; data-start=&quot;2209&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예제 3: 모든 숫자를 제곱 값으로 변환&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;List&amp;lt;Integer&amp;gt; squaredNumbers = numbers.stream() &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .map(num -&amp;gt; num * num) &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .collect(Collectors.toList());&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(squaredNumbers); &lt;span&gt;// 출력: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2483&quot; data-start=&quot;2454&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예제 4: 문자열 리스트에서 길이 변환&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;List&amp;lt;Integer&amp;gt; nameLengths = names.stream() &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .map(String::length) &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .collect(Collectors.toList()); &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(nameLengths); &lt;span&gt;// 출력: [5, 3, 6, 7]&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2665&quot; data-start=&quot;2662&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2696&quot; data-start=&quot;2667&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6️⃣ sorted()를 이용한 정렬&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2746&quot; data-start=&quot;2697&quot; data-ke-size=&quot;size16&quot;&gt;  sorted()는 요소를 &lt;b&gt;오름차순 또는 내림차순 정렬&lt;/b&gt;하는 기능을 합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;2771&quot; data-start=&quot;2748&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예제 5: 숫자 리스트 정렬&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;List&amp;lt;Integer&amp;gt; sortedNumbers = numbers.stream() .&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;sorted() &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .collect(Collectors.toList()); &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(sortedNumbers); &lt;span&gt;// 출력: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2995&quot; data-start=&quot;2964&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예제 6: 문자열 리스트를 사전순으로 정렬&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;List&amp;lt;String&amp;gt; sortedNames = names.stream()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;.sorted() &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .collect(Collectors.toList()); &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(sortedNames); &lt;span&gt;// 출력: [Alice, Andrew, Bob, Charlie]&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3200&quot; data-start=&quot;3179&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예제 7: 내림차순 정렬&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;List&amp;lt;Integer&amp;gt; descendingNumbers = numbers.stream() &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .sorted(Comparator.reverseOrder()) &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .collect(Collectors.toList()); &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(descendingNumbers); &lt;span&gt;// 출력: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3429&quot; data-start=&quot;3426&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3465&quot; data-start=&quot;3431&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7️⃣ collect()를 이용한 리스트 변환&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3523&quot; data-start=&quot;3466&quot; data-ke-size=&quot;size16&quot;&gt;  collect()는 스트림의 결과를 &lt;b&gt;리스트, 집합, 맵 등으로 변환&lt;/b&gt;하는 기능을 합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;3545&quot; data-start=&quot;3525&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예제 8: 리스트 변환&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;List&amp;lt;String&amp;gt; collectedNames = names.stream() &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .filter(name -&amp;gt; name.length() &amp;gt; &lt;span&gt;3&lt;/span&gt;) &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt;collect(Collectors.toList()); &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(collectedNames); &lt;span&gt;// 출력: [Alice, Andrew, Charlie]&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3777&quot; data-start=&quot;3755&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예제 9: Set으로 변환&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Set&amp;lt;String&amp;gt; uniqueNames = names.stream() &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt;collect(Collectors.toSet()); &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3893&quot; data-start=&quot;3870&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예제 10: Map으로 변환&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Map&amp;lt;String, Integer&amp;gt; nameLengthMap = names.stream() &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .collect(Collectors.toMap(name -&amp;gt; name, String::length)); &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(nameLengthMap); &lt;span&gt;// 출력: {Alice=5, Bob=3, Andrew=6, Charlie=7}&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;4109&quot; data-start=&quot;4106&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4144&quot; data-start=&quot;4111&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8️⃣ reduce()를 이용한 데이터 축소&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;4184&quot; data-start=&quot;4145&quot; data-ke-size=&quot;size16&quot;&gt;  reduce()는 모든 요소를 하나로 축약하는 기능을 합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;4213&quot; data-start=&quot;4186&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예제 11: 숫자 리스트의 합 계산&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;int&lt;/span&gt; &lt;span&gt;sum&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; numbers.stream() &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .reduce(&lt;span&gt;0&lt;/span&gt;, (a, b) -&amp;gt; a + b); &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;System.out.println(sum); &lt;span&gt;// 출력: 55&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;4353&quot; data-start=&quot;4327&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예제 12: 가장 긴 문자열 찾기&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Optional&amp;lt;String&amp;gt; longestName = names.stream() &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; .reduce((name1, name2) -&amp;gt; name1.length() &amp;gt; name2.length() ? name1 : name2);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;longestName.ifPresent(System.out::println); &lt;span&gt;// 출력: Charlie&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;4560&quot; data-start=&quot;4557&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4587&quot; data-start=&quot;4562&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  람다 &amp;amp; 스트림 메서드 정리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;4911&quot; data-start=&quot;4588&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;4911&quot; data-start=&quot;4641&quot;&gt;
&lt;tr data-end=&quot;4675&quot; data-start=&quot;4641&quot;&gt;
&lt;td&gt;stream()&lt;/td&gt;
&lt;td&gt;리스트, 배열을 스트림으로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4712&quot; data-start=&quot;4676&quot;&gt;
&lt;td&gt;filter()&lt;/td&gt;
&lt;td&gt;특정 조건을 만족하는 요소만 필터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4746&quot; data-start=&quot;4713&quot;&gt;
&lt;td&gt;map()&lt;/td&gt;
&lt;td&gt;요소를 변환하여 새로운 스트림 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4769&quot; data-start=&quot;4747&quot;&gt;
&lt;td&gt;sorted()&lt;/td&gt;
&lt;td&gt;정렬 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4804&quot; data-start=&quot;4770&quot;&gt;
&lt;td&gt;findAny()&lt;/td&gt;
&lt;td&gt;아무 요소 하나 찾기 (병렬)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4840&quot; data-start=&quot;4805&quot;&gt;
&lt;td&gt;findFirst()&lt;/td&gt;
&lt;td&gt;첫 번째 요소 찾기 (순차)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4880&quot; data-start=&quot;4841&quot;&gt;
&lt;td&gt;collect()&lt;/td&gt;
&lt;td&gt;결과를 리스트, 집합, 맵 등으로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4911&quot; data-start=&quot;4881&quot;&gt;
&lt;td&gt;reduce()&lt;/td&gt;
&lt;td&gt;모든 요소를 하나로 축약&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>개발 이론/JAVA</category>
      <category>java</category>
      <author>jeonghoe21</author>
      <guid isPermaLink="true">https://jeonghoe21.tistory.com/25</guid>
      <comments>https://jeonghoe21.tistory.com/25#entry25comment</comments>
      <pubDate>Tue, 4 Mar 2025 00:15:33 +0900</pubDate>
    </item>
    <item>
      <title>배열로 큐 구현</title>
      <link>https://jeonghoe21.tistory.com/24</link>
      <description>&lt;pre id=&quot;code_1740948638063&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;

public class Main {
    private int[] queue; // 큐를 저장할 배열
    private int front; // 큐의 맨 앞을 가리키는 인덱스
    private int rear; // 큐의 맨 뒤를 가리키는 인덱스
    private int size; // 현재 큐의 크기

    //   큐 초기화 (생성자)
    public Main(int capacity) {
        queue = new int[capacity]; // 주어진 크기의 배열 생성
        front = 0; // front를 0으로 초기화
        rear = 0; // rear도 0으로 초기화
        size = 0; // 초기 크기는 0
    }

    //   push 연산: 큐의 rear에 새로운 원소 추가
    public void push(int x) {
        if (size == queue.length) { // 큐가 꽉 찬 경우
            throw new IllegalStateException(&quot;Queue is full&quot;);
        }
        queue[rear] = x; // rear 위치에 x 저장
        rear = (rear + 1) % queue.length; // rear를 한 칸 이동 (원형 큐)
        size++; // 큐 크기 증가
    }

    //   pop 연산: 큐의 front에서 원소 제거 후 반환
    public int pop() {
        if (size == 0) { // 큐가 비어있으면 -1 반환
            return -1;
        }
        int result = queue[front]; // front 위치의 원소 저장
        front = (front + 1) % queue.length; // front를 한 칸 이동 (원형 큐)
        size--; // 큐 크기 감소
        return result;
    }

    //   size 연산: 큐에 있는 원소 개수 반환
    public int size() {
        return size;
    }

    //   empty 연산: 큐가 비어있는지 확인
    public int empty() {
        return size == 0 ? 1 : 0;
    }

    //   front 연산: 큐의 맨 앞 원소 반환 (제거하지 않음)
    public int front() {
        if (size == 0) {
            return -1;
        }
        return queue[front];
    }

    //   back 연산: 큐의 맨 뒤 원소 반환 (제거하지 않음)
    public int back() {
        if (size == 0) {
            return -1;
        }
        return queue[(rear - 1 + queue.length) % queue.length]; // 원형 큐의 마지막 원소 계산
    }

    public static void main(String[] args) throws IOException {
        //   빠른 입력을 위한 BufferedReader 사용
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //   빠른 출력을 위한 BufferedWriter 사용
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine()); // 명령어 개수 입력

        Main queue = new Main(n); // 입력된 크기로 큐 생성

        for (int i = 0; i &amp;lt; n; i++) {
            String command = br.readLine(); // 한 줄 입력받기
            String[] parts = command.split(&quot; &quot;); // 공백 기준으로 명령어 분리
            String cmd = parts[0]; // 명령어 추출

            switch (cmd) {
                case &quot;push&quot;: // push X
                    int x = Integer.parseInt(parts[1]);
                    queue.push(x);
                    break;
                case &quot;pop&quot;:
                    bw.write(queue.pop() + &quot;\n&quot;);
                    break;
                case &quot;size&quot;:
                    bw.write(queue.size() + &quot;\n&quot;);
                    break;
                case &quot;empty&quot;:
                    bw.write(queue.empty() + &quot;\n&quot;);
                    break;
                case &quot;front&quot;:
                    bw.write(queue.front() + &quot;\n&quot;);
                    break;
                case &quot;back&quot;:
                    bw.write(queue.back() + &quot;\n&quot;);
                    break;
                default:
                    throw new IllegalArgumentException(&quot;Invalid command: &quot; + cmd);
            }
        }

        //   출력 버퍼 비우기
        bw.flush();
        //   BufferedReader &amp;amp; BufferedWriter 닫기
        br.close();
        bw.close();
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>코딩테스트/JAVA</category>
      <category>java</category>
      <author>jeonghoe21</author>
      <guid isPermaLink="true">https://jeonghoe21.tistory.com/24</guid>
      <comments>https://jeonghoe21.tistory.com/24#entry24comment</comments>
      <pubDate>Mon, 3 Mar 2025 23:32:34 +0900</pubDate>
    </item>
    <item>
      <title>배열로 스택 구현</title>
      <link>https://jeonghoe21.tistory.com/23</link>
      <description>&lt;pre id=&quot;code_1740948224999&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;

public class Main {
    
    private int index = -1; // 스택의 최상단 인덱스 (초기값: -1, 즉 스택이 비어있는 상태)
    private int[] s = new int[10000]; // 최대 크기 10000의 스택 배열

    //   push 연산: 값을 스택에 추가
    public void push(int n) {
        s[++index] = n; // index를 증가시킨 후 해당 위치에 값 저장
    }

    //   pop 연산: 스택에서 최상단 값을 제거하고 반환
    public int pop() {
        if (empty()) 
            return -1; // 스택이 비어있다면 -1 반환
        return s[index--]; // 최상단 값을 반환하고 index를 감소
    }

    //   size 연산: 스택에 있는 요소 개수 반환
    public int size() {
        return index + 1; // index는 0부터 시작하므로, 개수는 index + 1
    }

    //   empty 연산: 스택이 비었는지 여부 반환
    public boolean empty() {
        return index == -1; // index가 -1이면 스택이 비어있는 상태
    }

    //   top 연산: 스택의 최상단 값을 반환 (제거하지 않음)
    public int top() {
        if (empty())
            return -1; // 스택이 비어있다면 -1 반환
        return s[index]; // 최상단 값 반환
    }

    public static void main(String[] args) throws IOException {
        //   빠른 입출력을 위한 BufferedReader &amp;amp; BufferedWriter 사용
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        Main stack = new Main(); // 스택 객체 생성

        int n = Integer.parseInt(br.readLine()); // 명령어 개수 입력 받기

        for (int i = 0; i &amp;lt; n; i++) {
            String cmd = br.readLine(); // 한 줄 입력 받기

            //   push 연산: &quot;push X&quot; 형태의 입력 처리
            if (cmd.startsWith(&quot;push&quot;)) { // &quot;push&quot;로 시작하는 문자열 확인
                int x = Integer.parseInt(cmd.substring(5).trim()); // &quot;push X&quot;에서 X 값을 추출
                stack.push(x);
            }
            //   pop 연산
            else if (cmd.equals(&quot;pop&quot;)) {
                bw.write(stack.pop() + &quot;\n&quot;);
            }
            //   size 연산
            else if (cmd.equals(&quot;size&quot;)) {
                bw.write(stack.size() + &quot;\n&quot;);
            }
            //   empty 연산
            else if (cmd.equals(&quot;empty&quot;)) {
                bw.write((stack.empty() ? 1 : 0) + &quot;\n&quot;);
            }
            //   top 연산
            else if (cmd.equals(&quot;top&quot;)) {
                bw.write(stack.top() + &quot;\n&quot;);
            }
        }

        //   버퍼에 있는 내용을 모두 출력
        bw.flush();
        //   BufferedReader &amp;amp; BufferedWriter 닫기
        br.close();
        bw.close();
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>코딩테스트/JAVA</category>
      <author>jeonghoe21</author>
      <guid isPermaLink="true">https://jeonghoe21.tistory.com/23</guid>
      <comments>https://jeonghoe21.tistory.com/23#entry23comment</comments>
      <pubDate>Mon, 3 Mar 2025 05:44:35 +0900</pubDate>
    </item>
    <item>
      <title>DFS, BFS</title>
      <link>https://jeonghoe21.tistory.com/22</link>
      <description>&lt;pre id=&quot;code_1740932493701&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {

    static boolean[] visited;
    static ArrayList&amp;lt;Integer&amp;gt;[] adjList;
    static StringBuilder dfsResult = new StringBuilder();
    static StringBuilder bfsResult = new StringBuilder();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken()); 
        int M = Integer.parseInt(st.nextToken()); 
        int V = Integer.parseInt(st.nextToken()); 

        adjList = new ArrayList[N + 1]; 
        for (int i = 1; i &amp;lt;= N; i++) {
            adjList[i] = new ArrayList&amp;lt;&amp;gt;();
        }

        for (int i = 0; i &amp;lt; M; i++) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            adjList[u].add(v);
            adjList[v].add(u);
        }

        for (int i = 1; i &amp;lt;= N; i++) {
            Collections.sort(adjList[i]);
        }

        visited = new boolean[N + 1];
        dfs(V);
        bw.write(dfsResult.toString() + &quot;\n&quot;);

        visited = new boolean[N + 1];
        bfs(V);
        bw.write(bfsResult.toString() + &quot;\n&quot;);

        bw.flush();
        bw.close();
        br.close();
    }

    static void dfs(int v) {
        visited[v] = true;
        dfsResult.append(v).append(&quot; &quot;);

        for (int next : adjList[v]) {
            if (!visited[next]) {
                dfs(next);
            }
        }
    }

    static void bfs(int start) {
        Queue&amp;lt;Integer&amp;gt; queue = new LinkedList&amp;lt;&amp;gt;();
        queue.offer(start);
        visited[start] = true;

        while (!queue.isEmpty()) {
            int v = queue.poll();
            bfsResult.append(v).append(&quot; &quot;);

            for (int next : adjList[v]) {
                if (!visited[next]) {
                    visited[next] = true;
                    queue.offer(next);
                }
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;264&quot; data-start=&quot;220&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  1. BufferedReader와 BufferedWriter&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;291&quot; data-start=&quot;265&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1) BufferedReader&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;505&quot; data-start=&quot;292&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;343&quot; data-start=&quot;292&quot;&gt;&lt;b&gt;BufferedReader는 Java에서 입력을 빠르게 읽어오는 클래스&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li data-end=&quot;388&quot; data-start=&quot;344&quot;&gt;System.in을 직접 사용하는 Scanner보다 속도가 빠릅니다.&lt;/li&gt;
&lt;li data-end=&quot;441&quot; data-start=&quot;389&quot;&gt;&lt;b&gt;입력을 한 줄씩 읽을 수 있기 때문에, readLine() 메서드를 사용&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li data-end=&quot;505&quot; data-start=&quot;442&quot;&gt;한 줄의 입력을 띄어쓰기로 구분된 여러 개의 값으로 나누기 위해 StringTokenizer를 활용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;690&quot; data-start=&quot;664&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2) BufferedWriter&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;840&quot; data-start=&quot;691&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;735&quot; data-start=&quot;691&quot;&gt;&lt;b&gt;BufferedWriter는 출력 속도를 향상시키는 클래스&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li data-end=&quot;773&quot; data-start=&quot;736&quot;&gt;System.out.println()보다 성능이 우수합니다.&lt;/li&gt;
&lt;li data-end=&quot;840&quot; data-start=&quot;774&quot;&gt;&lt;b&gt;write() 메서드를 사용하여 출력 데이터를 버퍼에 저장하고, flush()로 한 번에 출력&lt;/b&gt;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1033&quot; data-start=&quot;1030&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1083&quot; data-start=&quot;1035&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  2. DFS (Depth-First Search, 깊이 우선 탐색)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1200&quot; data-start=&quot;1084&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1149&quot; data-start=&quot;1084&quot;&gt;&lt;b&gt;그래프 탐색 기법 중 하나로, 한 방향으로 끝까지 탐색한 후 다시 돌아와 다른 경로를 탐색하는 방식&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li data-end=&quot;1200&quot; data-start=&quot;1150&quot;&gt;&lt;b&gt;스택(Stack) 또는 재귀(Recursion)를 활용&lt;/b&gt;하여 구현할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1217&quot; data-start=&quot;1202&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;DFS 동작 원리&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1343&quot; data-start=&quot;1218&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1238&quot; data-start=&quot;1218&quot;&gt;시작 노드를 방문하고 출력한다.&lt;/li&gt;
&lt;li data-end=&quot;1277&quot; data-start=&quot;1239&quot;&gt;현재 노드와 연결된 &lt;b&gt;아직 방문하지 않은 노드&lt;/b&gt;로 이동한다.&lt;/li&gt;
&lt;li data-end=&quot;1319&quot; data-start=&quot;1278&quot;&gt;더 이상 이동할 곳이 없으면 &lt;b&gt;되돌아가며 다른 경로를 탐색&lt;/b&gt;한다.&lt;/li&gt;
&lt;li data-end=&quot;1343&quot; data-start=&quot;1320&quot;&gt;모든 노드를 방문할 때까지 반복한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1621&quot; data-start=&quot;1618&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1673&quot; data-start=&quot;1623&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  3. BFS (Breadth-First Search, 너비 우선 탐색)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1758&quot; data-start=&quot;1674&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1730&quot; data-start=&quot;1674&quot;&gt;&lt;b&gt;그래프 탐색 기법 중 하나로, 시작 노드에서 가까운 노드부터 차례대로 탐색하는 방식&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li data-end=&quot;1758&quot; data-start=&quot;1731&quot;&gt;&lt;b&gt;큐(Queue)를 활용하여 구현&lt;/b&gt;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1775&quot; data-start=&quot;1760&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;BFS 동작 원리&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1881&quot; data-start=&quot;1776&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1810&quot; data-start=&quot;1776&quot;&gt;시작 노드를 방문하고 &lt;b&gt;큐(Queue)에 삽입&lt;/b&gt;한다.&lt;/li&gt;
&lt;li data-end=&quot;1863&quot; data-start=&quot;1811&quot;&gt;큐에서 노드를 꺼낸 후, &lt;b&gt;해당 노드와 연결된 방문하지 않은 노드를 큐에 추가&lt;/b&gt;한다.&lt;/li&gt;
&lt;li data-end=&quot;1881&quot; data-start=&quot;1864&quot;&gt;큐가 빌 때까지 반복한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2350&quot; data-start=&quot;2347&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2371&quot; data-start=&quot;2352&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2️⃣ 코드 상세 분석&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2550&quot; data-start=&quot;2448&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2492&quot; data-start=&quot;2448&quot;&gt;visited[] &amp;rarr; &lt;b&gt;각 노드의 방문 여부를 저장&lt;/b&gt;하는 배열입니다.&lt;/li&gt;
&lt;li data-end=&quot;2550&quot; data-start=&quot;2493&quot;&gt;adjList[] &amp;rarr; &lt;b&gt;각 노드에 연결된 다른 노드들의 정보를 저장하는 인접 리스트&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li data-end=&quot;2772&quot; data-start=&quot;2714&quot;&gt;&lt;b&gt;빠른 입출력을 위한 BufferedReader와 BufferedWriter 사용&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li data-end=&quot;3023&quot; data-start=&quot;2972&quot;&gt;StringTokenizer를 이용해 &lt;b&gt;띄어쓰기 기준으로 입력 값을 분리&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li data-end=&quot;3200&quot; data-start=&quot;3139&quot;&gt;&lt;b&gt;인접 리스트(ArrayList)를 생성&lt;/b&gt;하여 &lt;b&gt;각 노드에 연결된 노드를 저장&lt;/b&gt;할 공간을 만듭니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3568&quot; data-start=&quot;3429&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3457&quot; data-start=&quot;3429&quot;&gt;&lt;b&gt;입력된 간선을 인접 리스트에 저장&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li data-end=&quot;3501&quot; data-start=&quot;3458&quot;&gt;adjList[u].add(v) &amp;rarr; &lt;b&gt;u 노드에서 v 노드로 연결&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3568&quot; data-start=&quot;3502&quot;&gt;adjList[v].add(u) &amp;rarr; &lt;b&gt;v 노드에서 u 노드로 연결&lt;/b&gt;&lt;br /&gt;(양방향 그래프이므로 서로 연결)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;for&lt;/span&gt; (&lt;span&gt;int&lt;/span&gt; &lt;span&gt;i&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;1&lt;/span&gt;; i &amp;lt;= N; i++) { Collections.sort(adjList[i]); } &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3690&quot; data-start=&quot;3649&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3690&quot; data-start=&quot;3649&quot;&gt;&lt;b&gt;DFS와 BFS가 작은 숫자부터 방문하도록 리스트를 정렬&lt;/b&gt;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;visited = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;boolean&lt;/span&gt;[N + &lt;span&gt;1&lt;/span&gt;]; dfs(V); bw.write(dfsResult.toString() + &lt;span&gt;&quot;\n&quot;&lt;/span&gt;); &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3866&quot; data-start=&quot;3781&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3816&quot; data-start=&quot;3781&quot;&gt;dfs(V)를 호출하여 &lt;b&gt;DFS 탐색을 수행&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li data-end=&quot;3866&quot; data-start=&quot;3817&quot;&gt;&lt;b&gt;결과를 StringBuilder에 저장&lt;/b&gt;하고, 마지막에 한 번에 출력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;visited = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;boolean&lt;/span&gt;[N + &lt;span&gt;1&lt;/span&gt;]; bfs(V); bw.write(bfsResult.toString() + &lt;span&gt;&quot;\n&quot;&lt;/span&gt;); &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3992&quot; data-start=&quot;3957&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3992&quot; data-start=&quot;3957&quot;&gt;bfs(V)를 호출하여 &lt;b&gt;BFS 탐색을 수행&lt;/b&gt;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;bw.flush(); bw.close(); br.close(); &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4079&quot; data-start=&quot;4042&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4079&quot; data-start=&quot;4042&quot;&gt;&lt;b&gt;버퍼에 남아 있는 데이터를 한 번에 출력&lt;/b&gt;하고 종료합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>코딩테스트/JAVA</category>
      <category>java</category>
      <author>jeonghoe21</author>
      <guid isPermaLink="true">https://jeonghoe21.tistory.com/22</guid>
      <comments>https://jeonghoe21.tistory.com/22#entry22comment</comments>
      <pubDate>Mon, 3 Mar 2025 01:35:41 +0900</pubDate>
    </item>
  </channel>
</rss>