<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Codey</title>
    <link>https://minuk2.tistory.com/</link>
    <description>인생은 모른다</description>
    <language>ko</language>
    <pubDate>Mon, 29 Jun 2026 01:37:34 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Codey</managingEditor>
    <image>
      <title>Codey</title>
      <url>https://tistory1.daumcdn.net/tistory/5825322/attach/faf89168a4354d6da5499af0984ddfd6</url>
      <link>https://minuk2.tistory.com</link>
    </image>
    <item>
      <title>코드 분석과 웹 동작 과정</title>
      <link>https://minuk2.tistory.com/186</link>
      <description>&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/d07meQ/btsH0OYg4d8/Isf32fvlyKbykP0tLTrmv1/test.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;test.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.46MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. jar 파일&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpZ9eG/btsH1CQhOHi/fRonzz9QCiEph7KCCbWThk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpZ9eG/btsH1CQhOHi/fRonzz9QCiEph7KCCbWThk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpZ9eG/btsH1CQhOHi/fRonzz9QCiEph7KCCbWThk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpZ9eG%2FbtsH1CQhOHi%2FfRonzz9QCiEph7KCCbWThk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;103&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;cos.jar&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java 서블릿 애플리케이션에서 파일 업로드를 처리하는데 사용되는 라이브러리&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;jstl.jar&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSTL 태그 라이브러리를 정의하는데 필요한 인터페이스와 클래스를 제공&lt;/li&gt;
&lt;li&gt;실제 태그 라이브러리를 구성하기 위한 기본 정의를 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;mysql-connector-java-5.1.47.jar&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java 애플리케이션이 MySQL 데이터베이스와 통신할 수 있게 해주는 JDBC 드라이버&lt;/li&gt;
&lt;li&gt;Java 애플리케이션에서 MySQL 데이터베이스에 연결하고, 쿼리를 실행, 데이터를 처리 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;standard.jar&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSTL 태그 라이브러리의 실제 구현을 제공&lt;/li&gt;
&lt;li&gt;JSP 페이지에서 사용되는 태그 라이브러리의 실제 구현 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. source 파일&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;META-INF&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JAR 파일, WAR 파일, EAR 파일 등에서 메타데이터와 설정 정보를 포함하는 디렉토리&lt;/li&gt;
&lt;li&gt;자바 애플리케이션의 배포 및 구성을 관리하는데 중요한 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;context.xml&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JDBC : Java 기반 애플리케이션의 데이터를 데이터베이스에 저장 및 업데이트, 데이터베이스에 저장된 데이터를 Java에서 사용할 수 있도록 하는 자바 API&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1718605637725&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Context&amp;gt;
	&amp;lt;Resource
		name=&quot;jdbc/MySQLDB&quot;
        -- 이 이름을 통해 데이터베이스 리소스에 접근
		auth=&quot;Container&quot;
        -- 인증 방식 지정 (Tomcat)이 인증을 관리한다는 의미
        -- 애플리케이션은 인증 정보를 제공하지 않고 컨테이너가 대신 처리
		type=&quot;javax.sql.DataSource&quot;
        -- 데이터베이스 연결 풀을 의미함
		username=&quot;minuk&quot;
		password=&quot;minuk&quot;
		driverClassName=&quot;com.mysql.jdbc.Driver&quot;
        -- 드라이버 클래스 이름을 지정
        -- com.mysql.jdbc.Driver를 사용
		factory=&quot;org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory&quot;
        -- 데이터베이스 연결 풀을 생성할 때 사용할 팩토리 클래스 지정
   		-- BasicDataSourceFactory를 사용하여 연결 풀을 생성
		url=&quot;jdbc:mysql://localhost:3308/micom&quot;
        -- 데이터베이스에 연결할 때 사용할 JDBC URL을 지정
        -- localhost의 포트 3308에서 micom이라는 데이터베이스에 연결하도록 설정
		maxActive=&quot;500&quot;
        -- 동시에 연결할 수 있는 최대 활성 연결 수를 지정
	/&amp;gt;
&amp;lt;/Context&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;WEB-INF&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java 웹 애플리케이션에서 중요한 설정 파일들과 라이브러리들을 포함하는 특별한 디렉토리&lt;/li&gt;
&lt;li&gt;WEB-INF 디렉토리는 애플리케이션의 루트 디렉토리 아래에 위치하며, 외부에서 직접 접근할 수 없도록 보호&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;web.xml&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java 웹 애플리케이션의 배포 설명자&lt;/li&gt;
&lt;li&gt;서블릿, 서블릿 매핑, 환영 파일 목록 등을 정의하여 애플리케이션의 동작을 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1718607701991&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;web-app xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns=&quot;http://xmlns.jcp.org/xml/ns/javaee&quot; xsi:schemaLocation=&quot;http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd&quot; id=&quot;WebApp_ID&quot; version=&quot;3.1&quot;&amp;gt;
  &amp;lt;display-name&amp;gt;Chapter15&amp;lt;/display-name&amp;gt;
  &amp;lt;welcome-file-list&amp;gt;
    &amp;lt;welcome-file&amp;gt;index.html&amp;lt;/welcome-file&amp;gt;
    &amp;lt;welcome-file&amp;gt;index.htm&amp;lt;/welcome-file&amp;gt;
    &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;
    &amp;lt;welcome-file&amp;gt;default.html&amp;lt;/welcome-file&amp;gt;
    &amp;lt;welcome-file&amp;gt;default.htm&amp;lt;/welcome-file&amp;gt;
    &amp;lt;welcome-file&amp;gt;default.jsp&amp;lt;/welcome-file&amp;gt;
  &amp;lt;/welcome-file-list&amp;gt;
  
  &amp;lt;servlet&amp;gt;
      &amp;lt;servlet-name&amp;gt;ServletTest&amp;lt;/servlet-name&amp;gt;
      &amp;lt;servlet-class&amp;gt;ServletTest&amp;lt;/servlet-class&amp;gt;
  &amp;lt;/servlet&amp;gt;
  &amp;lt;servlet-mapping&amp;gt;
      &amp;lt;servlet-name&amp;gt;ServletTest&amp;lt;/servlet-name&amp;gt;
      &amp;lt;url-pattern&amp;gt;/sTest&amp;lt;/url-pattern&amp;gt;
      -- /sTest로 시작하는 URL 요청은 ServletTest 서블릿으로 라우팅
  &amp;lt;/servlet-mapping&amp;gt;
    &amp;lt;servlet&amp;gt;
      &amp;lt;servlet-name&amp;gt;ServletLifeCycle&amp;lt;/servlet-name&amp;gt;
      &amp;lt;servlet-class&amp;gt;ServletLifeCycle&amp;lt;/servlet-class&amp;gt;
  &amp;lt;/servlet&amp;gt;
  &amp;lt;servlet-mapping&amp;gt;
      &amp;lt;servlet-name&amp;gt;ServletLifeCycle&amp;lt;/servlet-name&amp;gt;
      &amp;lt;url-pattern&amp;gt;/sCycle&amp;lt;/url-pattern&amp;gt;
      -- /sCycle로 시작하는 URL 요청은 servletLifteCycle 서블릿으로 라우팅
  &amp;lt;/servlet-mapping&amp;gt;
  
  &amp;lt;!-- 2020.02.26.   by jwlee 
  &amp;lt;servlet&amp;gt;
      &amp;lt;servlet-name&amp;gt;ServletLifeCycle&amp;lt;/servlet-name&amp;gt;
      &amp;lt;servlet-class&amp;gt;ServletLifeCycle&amp;lt;/servlet-class&amp;gt;
  &amp;lt;/servlet&amp;gt;
  &amp;lt;servlet-mapping&amp;gt;
      &amp;lt;servlet-name&amp;gt;ServletLifeCycle&amp;lt;/servlet-name&amp;gt;
      &amp;lt;url-pattern&amp;gt;/ServletLifeCycle&amp;lt;/url-pattern&amp;gt;
  &amp;lt;/servlet-mapping&amp;gt;

  &amp;lt;servlet&amp;gt;
      &amp;lt;servlet-name&amp;gt;BoardFrontControllerClass&amp;lt;/servlet-name&amp;gt;
      &amp;lt;servlet-class&amp;gt;controller.BoardFrontController&amp;lt;/servlet-class&amp;gt;
  &amp;lt;/servlet&amp;gt;
  &amp;lt;servlet-mapping&amp;gt;
      &amp;lt;servlet-name&amp;gt;BoardFrontControllerClass&amp;lt;/servlet-name&amp;gt;
      &amp;lt;url-pattern&amp;gt;*.bo&amp;lt;/url-pattern&amp;gt;
  &amp;lt;/servlet-mapping&amp;gt;
  --&amp;gt;
&amp;lt;/web-app&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java 기반의 웹 애플리케이션에서 클라이언트의 요청을 하고, 동적 웹 콘텐츠를 생성&lt;/li&gt;
&lt;li&gt;HTTP 요청과 응답을 처리하는데 사용&lt;/li&gt;
&lt;li&gt;서버에서 실행되다가 웹 브라우저에서 요청을 하면 해당 기능을 수행한 후 웹 브라우저에 결과를 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GtcQ2/btsH1NRT5hK/xWoAKIDrLIk9Vk82E5kRsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GtcQ2/btsH1NRT5hK/xWoAKIDrLIk9Vk82E5kRsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GtcQ2/btsH1NRT5hK/xWoAKIDrLIk9Vk82E5kRsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGtcQ2%2FbtsH1NRT5hK%2FxWoAKIDrLIk9Vk82E5kRsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1180&quot; height=&quot;537&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;init()&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초기화&lt;/li&gt;
&lt;li&gt;서블릿 요청 시 맨 처음 한 번만 호출&lt;/li&gt;
&lt;li&gt;서블릿 생성 시 초기화 작업을 주로 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;service()&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP 요청을 처리&lt;/li&gt;
&lt;li&gt;요청에 따라 적절한 메서드를 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;doGet(), doPost()&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업 수행&lt;/li&gt;
&lt;li&gt;서블릿 요청 시 매번 호출&lt;/li&gt;
&lt;li&gt;실제로 클라이언트가 요청하는 작업을 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;destory()&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;종료&lt;/li&gt;
&lt;li&gt;서블릿이 기능을 수행하고 메모리에서 소멸될 때 호출&lt;/li&gt;
&lt;li&gt;서블릿의 마무리 작업을 주로 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 블로그 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://velog.io/@falling_star3/Tomcat-%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EC%9D%B4%EB%9E%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@falling_star3/Tomcat-%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EC%9D%B4%EB%9E%80&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718608278352&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Servlet] 서블릿(Servlet)이란?&quot; data-og-description=&quot;서블릿의 개념과 동작 과정, 생명주기(메서드), 인터페이스, 서블릿 컨테이너에 대해 공부하고 정리한 내용입니다.&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@falling_star3/Tomcat-%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EC%9D%B4%EB%9E%80&quot; data-og-url=&quot;https://velog.io/@falling_star3/Tomcat-서블릿Servlet이란&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eVghM/hyWlkBAG6D/CWWnqEehuOa8BpWu6U7FeK/img.jpg?width=946&amp;amp;height=477&amp;amp;face=0_0_946_477,https://scrap.kakaocdn.net/dn/ncsrW/hyWlenSiy1/sv9uf9JBwnv3TAE9C7QiFK/img.jpg?width=946&amp;amp;height=477&amp;amp;face=0_0_946_477,https://scrap.kakaocdn.net/dn/uLxOJ/hyWoGQyyXg/qda7xgDU6mHfWGzdiN8kDK/img.png?width=1330&amp;amp;height=747&amp;amp;face=0_0_1330_747&quot;&gt;&lt;a href=&quot;https://velog.io/@falling_star3/Tomcat-%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EC%9D%B4%EB%9E%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@falling_star3/Tomcat-%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EC%9D%B4%EB%9E%80&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eVghM/hyWlkBAG6D/CWWnqEehuOa8BpWu6U7FeK/img.jpg?width=946&amp;amp;height=477&amp;amp;face=0_0_946_477,https://scrap.kakaocdn.net/dn/ncsrW/hyWlenSiy1/sv9uf9JBwnv3TAE9C7QiFK/img.jpg?width=946&amp;amp;height=477&amp;amp;face=0_0_946_477,https://scrap.kakaocdn.net/dn/uLxOJ/hyWoGQyyXg/qda7xgDU6mHfWGzdiN8kDK/img.png?width=1330&amp;amp;height=747&amp;amp;face=0_0_1330_747');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Servlet] 서블릿(Servlet)이란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;서블릿의 개념과 동작 과정, 생명주기(메서드), 인터페이스, 서블릿 컨테이너에 대해 공부하고 정리한 내용입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 애플리케이션의 URL 구조와 서블릿 클래스를 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch9xuj/btsH198rjB3/gRe1k6QeM2oGMXQP0vHy40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch9xuj/btsH198rjB3/gRe1k6QeM2oGMXQP0vHy40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch9xuj/btsH198rjB3/gRe1k6QeM2oGMXQP0vHy40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch9xuj%2FbtsH198rjB3%2FgRe1k6QeM2oGMXQP0vHy40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;413&quot; height=&quot;134&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;classes&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴파일 된 Java 클래스 파일이 포함&lt;/li&gt;
&lt;li&gt;배포된 애플리케이션에서 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;src&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java 소스 코드 파일을 포함하며, 개발 및 컴파일 단계에 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동작 과정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ARaWG/btsH1DIJPmw/vuwqpVSPtLdUwon4kr9i80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ARaWG/btsH1DIJPmw/vuwqpVSPtLdUwon4kr9i80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ARaWG/btsH1DIJPmw/vuwqpVSPtLdUwon4kr9i80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FARaWG%2FbtsH1DIJPmw%2FvuwqpVSPtLdUwon4kr9i80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;626&quot; height=&quot;448&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자는 src에 코드를 작성&lt;/li&gt;
&lt;li&gt;ServletLifeCycle.java 등 파일은 javac 컴파일러를 사용하여 컴파일 됨&lt;/li&gt;
&lt;li&gt;컴파일된 클래스 파일(.class)은 'classes' 디렉토리에 저장됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;바이트코드 파일로 변환됨 이는 JVM에 의해 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;web.xml에서 클래스 파일을 매핑하여 주어서 classes에 파일에 있는 바이트코드를 참조&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;</description>
      <category>공부/리눅스</category>
      <author>Codey</author>
      <guid isPermaLink="true">https://minuk2.tistory.com/186</guid>
      <comments>https://minuk2.tistory.com/186#entry186comment</comments>
      <pubDate>Mon, 17 Jun 2024 17:14:27 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 환경 기반 JSP 웹 서버 구축 2</title>
      <link>https://minuk2.tistory.com/185</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;a href=&quot;https://minuk2.tistory.com/184&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://minuk2.tistory.com/184&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718245343360&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;리눅스 환경 기반 JSP 웹서버 구축&quot; data-og-description=&quot;필요 테스트 파일1. 아파치 설치리눅스 운영체제에서는 패키지와 패키지 매니저를 지원합니다.리눅스 패키지 : 여러 파일을 모아 하나의 파일로 저장하고 있는 압축 파일입니다.sudo suapt update-- &quot; data-og-host=&quot;minuk2.tistory.com&quot; data-og-source-url=&quot;https://minuk2.tistory.com/184&quot; data-og-url=&quot;https://minuk2.tistory.com/184&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bm6khD/hyWliW67kF/PyMBnHJsrEHnnsqkI6sQ6K/img.png?width=800&amp;amp;height=959&amp;amp;face=0_0_800_959,https://scrap.kakaocdn.net/dn/kbyu1/hyWljBKgn1/eBBWbDYqjIyZZ6jTT7b2j0/img.png?width=800&amp;amp;height=959&amp;amp;face=0_0_800_959,https://scrap.kakaocdn.net/dn/P9IoC/hyWlbRej5q/dGsBEs0vLHUtlzKxbRwnR0/img.png?width=813&amp;amp;height=975&amp;amp;face=0_0_813_975&quot;&gt;&lt;a href=&quot;https://minuk2.tistory.com/184&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://minuk2.tistory.com/184&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bm6khD/hyWliW67kF/PyMBnHJsrEHnnsqkI6sQ6K/img.png?width=800&amp;amp;height=959&amp;amp;face=0_0_800_959,https://scrap.kakaocdn.net/dn/kbyu1/hyWljBKgn1/eBBWbDYqjIyZZ6jTT7b2j0/img.png?width=800&amp;amp;height=959&amp;amp;face=0_0_800_959,https://scrap.kakaocdn.net/dn/P9IoC/hyWlbRej5q/dGsBEs0vLHUtlzKxbRwnR0/img.png?width=813&amp;amp;height=975&amp;amp;face=0_0_813_975');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;리눅스 환경 기반 JSP 웹서버 구축&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;필요 테스트 파일1. 아파치 설치리눅스 운영체제에서는 패키지와 패키지 매니저를 지원합니다.리눅스 패키지 : 여러 파일을 모아 하나의 파일로 저장하고 있는 압축 파일입니다.sudo suapt update--&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;minuk2.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;지난 글에서 이어집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;교수님 과제 : 리눅스에 구축하여 오류를 수정하라.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;&lt;span&gt;모델 2 아키텍처 (MVC 패턴)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Model(모델) :&amp;nbsp;&lt;/b&gt;비즈니스 로직 및 데이터 접근 담당&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;View(뷰) :&amp;nbsp;&amp;nbsp;&lt;/b&gt;사용자 인터페이스 담당, JSP로 구현&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Controller(컨트롤러) :&lt;/b&gt; 클라이언트 요청을 처리, 모델과 뷰 사이를 연결, 서블릿으로 구현&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/lLA8H/btsHXh6j2vD/SZxNVObzMQd9qPtNZtKqZK/ubuntu.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ubuntu.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.46MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;1.&amp;nbsp; PC에서 우분투 서버로 zip 파일 이동&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718247829999&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- cmd --
scp ubuntu.zip ubuntu@192.168.178.133:/home/ubuntu
-- ubuntu --
unzip model2_jsp.zip
cd [옮길 파일 경로]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIn8HS/btsHWQaiwVW/lT6yKGCNVkvtmuBnOOKqo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIn8HS/btsHWQaiwVW/lT6yKGCNVkvtmuBnOOKqo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIn8HS/btsHWQaiwVW/lT6yKGCNVkvtmuBnOOKqo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIn8HS%2FbtsHWQaiwVW%2FlT6yKGCNVkvtmuBnOOKqo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;448&quot; height=&quot;79&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;2.&amp;nbsp; 파일 압축 풀기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718248661402&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;unzip ubuntu.zip&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;3.&amp;nbsp; 파일 복사하여 이동&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;META-INF&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;src&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1718249246929&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cp -r /home/ubuntu/META-INF/* /var/lib/tomcat9/webapps/ROOT
cp -r /home/ubuntu/src/* /var/lib/tomcat9/webapps/ROOT&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;4. MySQL에서 테이블 생성&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718249631930&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mysql -u root
use micom;
source /home/ubuntu/sql/board.sql;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;5. ssh로 접속&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718251008748&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh ubuntu@192.168.178.133
sudo chmod -R 777 /var/lib/tomcat9/webapps/ROOT/WEB-INF/classes
-- classes 디렉토리에 전체 권한을 부여합니다.
javac -encoding ISO-8859-1 -classpath /usr/share/tomcat9/lib/servlet-api.jar:/var/lib/tomcat9/webapps/ROOT/WEB-INF/classes -d /var/lib/tomcat9/webapps/ROOT/WEB-INF/classes /var/lib/tomcat9/webapps/ROOT/WEB-INF/src/*.java
-- 소스 코드의 인코딩이 ISO-8859-1이기 때문에, 이를 명시하여 컴파일
-- 컴파일은 Java 소스 코드를 바이트코드로 변환하여 JVM에서 실행 가능하게 함&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;6. mysql 테이블 이름 변경&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718254505450&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mysql -u root
use micom;
rename table BOARD to board;
* 오류 : 리눅스 운영체제에서 MySQL은 테이블 이름을 대소문자를 구분하여 테이블명을 변경&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;7. 경로 변경&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718255461615&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /var/lib/tomcat9/webapps/ROOT/WEB-INF/src/action
vi BoardWriteProAction.java
String saveFolder=&quot;var/lib/tomcat9/webapps/ROOT/boardUpload&quot;
* 오류 : 파일 업로드가 되지 않는 오류
-- 20줄에 코드 수정
-- 파일 업로드 디렉토리를 지정하는 코드
-- 경로가 &quot;/boardUpload&quot;로 절대 경로로 설정되어 있음
-- 절대 경로를 사용하면 애플리케이션이 다른 위치에서 실행될 때에도 파일 경로를 정확하게 참조할 수 있습니다.
-- 파일 업로드와 관련된 보안 및 접근 권한을 일관되게 관리할 수 있음&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;8. 권한 부여&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718256500619&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod -R 777 /var/lib/tomcat9/webapps/ROOT/boardUpload
-- boardUpload 디렉토리와 그 안의 모든 파일 및 하위 디렉토리에 대해 읽기, 쓰기, 실행 권한을 부여&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;9. 파일 다운로드시 오류 해결&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X0JBQ/btsHYJVjCmH/v37JKyugKKJVoL37SYAVKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X0JBQ/btsHYJVjCmH/v37JKyugKKJVoL37SYAVKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X0JBQ/btsHYJVjCmH/v37JKyugKKJVoL37SYAVKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX0JBQ%2FbtsHYJVjCmH%2Fv37JKyugKKJVoL37SYAVKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;814&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1718257445918&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /var/lib/tomcat9/webapps/ROOT/board
vi file_down.jsp
String sFilePath = sDownloadPath + &quot;\\&quot; + fileName;를 
String sFilePath = sDownloadPath + &quot;/&quot; + fileName;로 변경&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;'\\'는 Windows에서 사용하는 경로 구분자&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;'/' 유닉스 계열(Linux, macOS 등)에서 사용하는 경로 구분자&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;현재는 리눅스에서 사용하기 때문에 '/'를 쓰면 됨&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;</description>
      <category>공부/리눅스</category>
      <category>MVC</category>
      <category>ubuntu</category>
      <category>리눅스 기반 jsp 웹 서버 구축</category>
      <author>Codey</author>
      <guid isPermaLink="true">https://minuk2.tistory.com/185</guid>
      <comments>https://minuk2.tistory.com/185#entry185comment</comments>
      <pubDate>Thu, 13 Jun 2024 14:49:03 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 환경 기반 JSP 웹서버 구축</title>
      <link>https://minuk2.tistory.com/184</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;구축 환경&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;ubuntu version 22.04.3&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/79Rxq/btsHXReFYC2/LeNk4NkYq4uScz2KF1neW0/C.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;C.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.45MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;1. 아파치 설치&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;리눅스 운영체제에서는 패키지와 패키지 매니저를 지원합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;리눅스 패키지 : 여러 파일을 모아 하나의 파일로 저장하고 있는 압축 파일입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1718176102731&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo su
apt update
-- 패키지 업데이트 : 패키지를 다운로드 할 수 있는 저장소의 최신 정보를 업데이트 
apt install -y apache2
-- 아파치 설치
ufw allow http
-- http 방화벽을 해제
ufw allow https
-- https 방화벽을 해제&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;2. 자기 IP로 웹에서 접근해보기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;813&quot; data-origin-height=&quot;975&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c45KjM/btsHXD1IzuA/0UjuN9bepaD0T5ti2MUasK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c45KjM/btsHXD1IzuA/0UjuN9bepaD0T5ti2MUasK/img.png&quot; data-alt=&quot;성공적으로 접속이 가능한 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c45KjM/btsHXD1IzuA/0UjuN9bepaD0T5ti2MUasK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc45KjM%2FbtsHXD1IzuA%2F0UjuN9bepaD0T5ti2MUasK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;813&quot; height=&quot;975&quot; data-origin-width=&quot;813&quot; data-origin-height=&quot;975&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;성공적으로 접속이 가능한 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;3. 자바 설치&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718176514821&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt-get install -y openjdk-11-jdk
-- jdk11을 설치하는 명령어입니다.
-- apt-get : 패키지를 설치, 업그레이드, 제거 및 관리하기 위한 명령어
-- install : apt-get의 하위 명령어로 지정된 패키지를 설치
-- y : 설치 중 발생하는 모든 명령어를 yes로 응답
-- openjdk-11-jdk는 jdk(11)을 의미하며 자바 애플리케이션을 개발하고 실행하는데 필요한 도구와 라이브러리

javac -version
-- 설치된 버전을 확인합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;51&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vzzch/btsHU7YfQ3d/fn2WkQntHU1TXMvCSwOXiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vzzch/btsHU7YfQ3d/fn2WkQntHU1TXMvCSwOXiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vzzch/btsHU7YfQ3d/fn2WkQntHU1TXMvCSwOXiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvzzch%2FbtsHU7YfQ3d%2Ffn2WkQntHU1TXMvCSwOXiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;326&quot; height=&quot;51&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;51&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;4. 톰캣 설치&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718177265507&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt-get install -y tomcat9
-- 톰캣 설치&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;5. 톰캣 설치 확인&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J0QMF/btsHVYzxDYN/Mxsogs1A02xThgz2iFRn7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J0QMF/btsHVYzxDYN/Mxsogs1A02xThgz2iFRn7k/img.png&quot; data-alt=&quot;자신의 주소와 톰캣의 포트번호(8080)을 입력하여 확인합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J0QMF/btsHVYzxDYN/Mxsogs1A02xThgz2iFRn7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ0QMF%2FbtsHVYzxDYN%2FMxsogs1A02xThgz2iFRn7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;950&quot; height=&quot;555&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자신의 주소와 톰캣의 포트번호(8080)을 입력하여 확인합니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;6. 아파치와 톰캣 연동&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718177470830&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt-get install &amp;ndash;y libapache2-mod-jk
-- 아파치 http 서버와 tomcat 애플리케이션 서버 간의 통합을 위한 모듈 mod_jk를 설치하기 위함
vi /etc/libapache2-mod-jk/workers.properties
-- mod_jk 모듈의 설정을 변경
workers.tomcat_home=/usr/share/tomcat9
-- tomcat 서버의 홈 디렉토리를 지정하는 설정
-- user/share/tomcat9 : tomcat 서버가 설치된 디렉토리 경로
workers.java_home=/usr/lib/jvm/openjdk-11
-- java 홈 디렉토리를 지정하는 설정 항목
-- /usr/lib/jvm/openjdk-11 : openjdk 11이 설치된 디렉토리 경로&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRRxwk/btsHVW2OCbM/BMnDuKxfQa8IEFIRP7qJ31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRRxwk/btsHVW2OCbM/BMnDuKxfQa8IEFIRP7qJ31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRRxwk/btsHVW2OCbM/BMnDuKxfQa8IEFIRP7qJ31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRRxwk%2FbtsHVW2OCbM%2FBMnDuKxfQa8IEFIRP7qJ31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;799&quot; height=&quot;599&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;599&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;7. 아파치 HTTP 서버의 기본 가상 호스트 설정 파일 설정&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718178036587&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi /etc/apache2/sites-available/000-default.conf
-- 아파치 HTTP 서버의 기본 가상 호스트 설정 파일
-- *가상 호스트 : 하나의 아파치 HTTP 서버 인스턴스에서 여러 웹사이트를 호스팅할 수 있도록 해주는 기술
DocIumentRoot /var/lib/tomcat9/webapps/ROOT
-- 아파치 HTTP 서버가 기본적으로 제공할 웹사이트의 루트 디렉토리를 지정
JkMount /* ajp13_worker
-- JkMount는 URL 패턴을 톰캣 서버로 전달하도록 설정
-- /* : 이 패턴은 모든 요청을 의미. 즉, 루트 경로부터 시작하는 모든 URL에 대한 요청을 포함
-- ajp13_worker : HTTP 서버가 AJP를 사용하여 Tomcat 서버와 통신할 수 있도록 설정된 커넥터&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;8. Tomcat과 AJP 커넥터 연결&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;AJP 커넥터 : 웹 서버와 애플리케이션 서버 간에 요청을 전달하는 역할을 하는 커넥터&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1718180318524&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi /etc/tomcat9/server.xml
&amp;lt;Connector 	protocol=&amp;ldquo;AJP/1.3&amp;rdquo;
			address=&amp;ldquo;::1&amp;rdquo;
			port=&amp;ldquo;8009&amp;rdquo;
			redirectport=&amp;ldquo;8443&amp;rdquo; /&amp;gt;
-- 이 부분에 주석을 수정해줍니다.
&amp;lt;Connector 	protocol=&amp;ldquo;AJP/1.3&amp;rdquo;
			address=&amp;ldquo;0.0.0.0&amp;rdquo;
            -- 모든 네트워크 인터페이스 의미
			port=&amp;ldquo;8009&amp;rdquo;
			redirectport=&amp;ldquo;8443&amp;rdquo; 
			secretRequired=&amp;ldquo;false&amp;rdquo;
            -- AJP 커넥터가 요청을 수락할 때 비밀키를 요구하지 않게 설정
            -- 내부 네트워크에서 빠르게 설정하고 동작을 확인하기 위해 비밀 키 설정을 생략
            /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;9. 설정 적용을 위해 아파치와 톰캣 재시작&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718180561739&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;service apache2 restart
service tomcat9 restart&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PVwoG/btsHVs86d8C/ugqmIEZBKxNCOEEECqOkk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PVwoG/btsHVs86d8C/ugqmIEZBKxNCOEEECqOkk1/img.png&quot; data-alt=&quot;자기 자신의 ip만 입력해도 바로 톰캣서버로 이동됩니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PVwoG/btsHVs86d8C/ugqmIEZBKxNCOEEECqOkk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPVwoG%2FbtsHVs86d8C%2FugqmIEZBKxNCOEEECqOkk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;958&quot; height=&quot;545&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자기 자신의 ip만 입력해도 바로 톰캣서버로 이동됩니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;10. MySQL 설치&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718180893246&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt install &amp;ndash;y mysql-server
-- MySQL를 설치
ufw allow mysql
-- 방화벽 해제
mysql -u root
-- mysql 접속
create database micom;
-- micom db를 생성
create user &amp;lsquo;minuk&amp;rsquo;@&amp;rsquo;%&amp;rsquo; identified by &amp;lsquo;minuk&amp;rsquo;;
-- user 생성
grant all privileges on *.* to 'minuk'@'%' with grant option;
-- 접속 권한 주기
flush privileges;
-- 변경 내용 적용
exit
-- mysql 접속 종료
vi /etc/mysql/mysql.conf.d/mysqld.cnf
-- mysql 서버의 주요 설정 파일 중 하나
bind-address = 0.0.0.0
-- 모든 ip 주소에서 접근 허용
systemctl restart mysql
-- mysql 재실행&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nd785/btsHVG67rjR/bR5VWUhF9rIkOUV9s4ludk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nd785/btsHVG67rjR/bR5VWUhF9rIkOUV9s4ludk/img.png&quot; data-alt=&quot;bind-address를 저렇게 변경해주시면 됩니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nd785/btsHVG67rjR/bR5VWUhF9rIkOUV9s4ludk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnd785%2FbtsHVG67rjR%2FbR5VWUhF9rIkOUV9s4ludk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;795&quot; height=&quot;450&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;bind-address를 저렇게 변경해주시면 됩니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;11. PC 파일을 우분투로 옮기기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718182953164&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;scp C.zip ubuntu@192.168.178.133:/home/ubuntu
-- ubuntu@192.168.178.133 : 원격 서버의 사용자 이름과 ip 주소
-- /home/ubuntu : 원격 서버의 경로
-- 필요한 파일을 압축하여 우분투 서버에 옮겨줍시다.

apt install unzip
-- zip 파일 압축해제를 위해 다운

unzip C.zip
-- unzip [파일명.zip]

cd [옮길 파일 경로]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tuDol/btsHXRFEhoB/z9XBUfPSQeFj8RxCRKsLYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tuDol/btsHXRFEhoB/z9XBUfPSQeFj8RxCRKsLYk/img.png&quot; data-alt=&quot;이 파일들을 옮겨보겟습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tuDol/btsHXRFEhoB/z9XBUfPSQeFj8RxCRKsLYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtuDol%2FbtsHXRFEhoB%2Fz9XBUfPSQeFj8RxCRKsLYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;727&quot; height=&quot;78&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 파일들을 옮겨보겟습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1718183901581&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /home/ubuntu/linuxsource 
-- 옮길 파일이 있는 디렉토리 경로로 접속
mv mysql-connector-java-5.1.47.jar /var/lib/tomcat9/lib
mv cos.jar /var/lib/tomcat9/lib
mv jstl.jar /var/lib/tomcat9/lib
mv standard.jar /var/lib/tomcat9/lib&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zxoV2/btsHWukETsX/YzekBfd0QQL065uVieoq7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zxoV2/btsHWukETsX/YzekBfd0QQL065uVieoq7K/img.png&quot; data-alt=&quot;그 다음 소스 구축 자료 파일과 MEFTA-IFN 파일들을 톰캣 ROOT에 옮겨보겠습다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zxoV2/btsHWukETsX/YzekBfd0QQL065uVieoq7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzxoV2%2FbtsHWukETsX%2FYzekBfd0QQL065uVieoq7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;470&quot; height=&quot;122&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그 다음 소스 구축 자료 파일과 MEFTA-IFN 파일들을 톰캣 ROOT에 옮겨보겠습다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1718184160566&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mv css /var/lib/tomcat9/webapps/ROOT
mv kboard /var/lib/tomcat9/webapps/ROOT
mv kmember /var/lib/tomcat9/webapps/ROOT
mv META-INF /var/lib/tomcat9/webapps/ROOT
mv nboard /var/lib/tomcat9/webapps/ROOT
mv script /var/lib/tomcat9/webapps/ROOT
mv WEB-INF /var/lib/tomcat9/webapps/ROOT&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;12. MySQL context.xml 파일 수정&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SPJ0l/btsHWCpvbGx/0CvNg1bic7eAtK73268160/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SPJ0l/btsHWCpvbGx/0CvNg1bic7eAtK73268160/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SPJ0l/btsHWCpvbGx/0CvNg1bic7eAtK73268160/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSPJ0l%2FbtsHWCpvbGx%2F0CvNg1bic7eAtK73268160%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;801&quot; height=&quot;222&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1718185244493&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi /var/lib/tomcat9/webapps/ROOT/META-INF/context.xml
username = minuk
-- 본인이 설정한 것으로 수정
password = minuk
-- 본인이 설정한 것으로 수정&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;13. MySQL에서 DB 생성&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718185313584&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mysql -u root
use micom;
source /home/ubuntu/sql/kboard.sql;
source /home/ubuntu/sql/kmember.sql;
source /home/ubuntu/sql/member.sql;
source /home/ubuntu/sql/nboard.sql;
-- sql문이 있는 경로에 있는 sql문을 source로 적용시켜줍니다.
show tables;
-- 테이블이 만들어졌는지 확인&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;14. http://우분투서버 ip/login.do로 접속하여 확인&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o4J8k/btsHXBQH05G/CtsS8kuhchKhNIGuxJ7hNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o4J8k/btsHXBQH05G/CtsS8kuhchKhNIGuxJ7hNK/img.png&quot; data-alt=&quot;회원가입 및 테스트 해보기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o4J8k/btsHXBQH05G/CtsS8kuhchKhNIGuxJ7hNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo4J8k%2FbtsHXBQH05G%2FCtsS8kuhchKhNIGuxJ7hNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;506&quot; height=&quot;225&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;회원가입 및 테스트 해보기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1718189718196&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use micom;
mysql -u root
select * from kmember;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYl08V/btsHWVbjrOV/derWrFfSLzqY4vJBQRCp01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYl08V/btsHWVbjrOV/derWrFfSLzqY4vJBQRCp01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYl08V/btsHWVbjrOV/derWrFfSLzqY4vJBQRCp01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYl08V%2FbtsHWVbjrOV%2FderWrFfSLzqY4vJBQRCp01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;434&quot; height=&quot;111&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;</description>
      <category>공부/리눅스</category>
      <category>Apache</category>
      <category>MySQL</category>
      <category>tomcat</category>
      <category>리눅스</category>
      <category>서버</category>
      <author>Codey</author>
      <guid isPermaLink="true">https://minuk2.tistory.com/184</guid>
      <comments>https://minuk2.tistory.com/184#entry184comment</comments>
      <pubDate>Wed, 12 Jun 2024 19:58:07 +0900</pubDate>
    </item>
    <item>
      <title>[럭스로보/MODI] 7일간의 합숙 훈련, Village of IoT (금상 수상작)</title>
      <link>https://minuk2.tistory.com/183</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;22 .07.01~ 22.07.08&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-id=&quot;6cecb5d8-f2a2-4827-9c9e-9d41e9d60520&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;2022년 7월 1일부터 7월 8일까지 여름방학 동안, MODI를 활용한 자유 주제로 7일간의 팀 프로젝트를 준비하게 되었습니다. 이번 코딩 대회와 팀 프로젝트는 저에게 새로운 도전과 배움의 기회를 선사했습니다. 특히, 7일간의 합숙훈련을 통해 팀원들과 함께 스마트시티를 구축하는 과정은 평생 잊지 못할 소중한 경험이 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;처음으로 참가한 코딩 대회와 팀 프로젝트는 두려움과 설렘이 공존하는 순간이었습니다. 새로운 기술을 배우고, 팀원들과 협력하며 문제를 해결하는 과정은 저에게 많은 성장을 안겨주었습니다. 이 글에서는 그 여정과 배운 점들을 공유하고자 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;주제&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Village of IoT (스마트시티 프로젝트)&lt;br /&gt;&lt;/b&gt; 이 프로젝트는 수많은 모듈을 사용하여 도시가 스스로 작동하며, 사람들이 아닌 시스템이 스스로 일을 처리해주는 작은 사회를 만드는 것을 목표&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;팀소개&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;서XX : 1학년&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;유XX : 1학년&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;박XX : 1학년 (본인)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이XX : 1학년&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;아이디어 스케치&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0nv66/btsHUaGYukx/V5kRge7xjmp7jkKgbejTT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0nv66/btsHUaGYukx/V5kRge7xjmp7jkKgbejTT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0nv66/btsHUaGYukx/V5kRge7xjmp7jkKgbejTT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0nv66%2FbtsHUaGYukx%2FV5kRge7xjmp7jkKgbejTT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;378&quot; height=&quot;377&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;각각 섹션으로 나누어서 컨셉을 맞추어서 아이디어를 구상해보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;파트 1 주거 공간 : 자동문, 엘리베이터&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;파트 2 엔터테인먼트 : 게임보이, 다마고치, 포켓몬 골드, 주크박스&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;파트 3 공공기관 및 보안관리 : 지진감지, 대공방어시스템, 감옥&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;파트 4 무인주차 정산시스템 및 은행 : 무인주차, 금고&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;교통 시스템 : 신호등 및 신호 위반감지센서, 가로등&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;모듈 / 재료&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 221px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323; font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;모듈 / 재료&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323; font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;모터, 다이얼, 낚시줄, 버튼&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;엘리베이터&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;적외선, 모터&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;자동문&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;디스플레이, 다이얼, 버튼&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;포켓몬 미니게임&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다이얼, 버튼, 디스플레이, 스피커&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다마고치 미니게임&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;자이로, 스피커&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;지진감지기&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;초음파, led, 스피커&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;대공방어 시스템&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;버튼, 모터&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;감옥문&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;환경, led&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;가로등&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;모터, 디스플레이, led&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;자동주차공간(주차 정산 시스템)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;led, 적외선, 스피커&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;신호등 및 신호위반감지센서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다이얼, 스피커&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;금고&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;적외선, 스피커&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;센서 감지 주크박스&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Village of IoT 전체적인 모습&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; 프로젝트의 최종 결과물을 바라보며, 마감일까지 밤을 새워가며 작업한 노력이 결실을 맺었음을 실감할 수 있었습니다. 완성된 모습을 보니 한없이 뿌듯한 마음이 들었습니다. 이제, 각 세부 요소들을 하나씩 상세히 설명해 드리겠습니다. &lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;802&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCvrlr/btsHUqpi0rN/WwQfOjcKEUOlvX4XsJatx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCvrlr/btsHUqpi0rN/WwQfOjcKEUOlvX4XsJatx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCvrlr/btsHUqpi0rN/WwQfOjcKEUOlvX4XsJatx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCvrlr%2FbtsHUqpi0rN%2FWwQfOjcKEUOlvX4XsJatx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1882&quot; height=&quot;802&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;802&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;적외선 센서 자동문&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOU0U6/btsHTCRypmS/OxzjC1T3w9CG2cVIYuRT61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOU0U6/btsHTCRypmS/OxzjC1T3w9CG2cVIYuRT61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOU0U6/btsHTCRypmS/OxzjC1T3w9CG2cVIYuRT61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOU0U6%2FbtsHTCRypmS%2FOxzjC1T3w9CG2cVIYuRT61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1388&quot; height=&quot;559&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;적외선 센서로 사람 또는 사물을 인식하는 자동문입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;적외선 센서에 특정 거리가 되면 모터를 가동시켜 8초동안 유지합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;엘리베이터&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1923&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3CSam/btsHUmUQBUk/2LNkAQVS9k81r37di5RHQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3CSam/btsHUmUQBUk/2LNkAQVS9k81r37di5RHQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3CSam/btsHUmUQBUk/2LNkAQVS9k81r37di5RHQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3CSam%2FbtsHUmUQBUk%2F2LNkAQVS9k81r37di5RHQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1923&quot; height=&quot;810&quot; data-origin-width=&quot;1923&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1748&quot; data-origin-height=&quot;761&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OtAoA/btsHUE1YbRD/JPsVc1GnnQY8FeCq53wPS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OtAoA/btsHUE1YbRD/JPsVc1GnnQY8FeCq53wPS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OtAoA/btsHUE1YbRD/JPsVc1GnnQY8FeCq53wPS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOtAoA%2FbtsHUE1YbRD%2FJPsVc1GnnQY8FeCq53wPS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1748&quot; height=&quot;761&quot; data-origin-width=&quot;1748&quot; data-origin-height=&quot;761&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;휴대폰으로 wifi를 연결하여 만든 엘리베이터입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;다마고치 게임&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQJdyd/btsHUcx9Tjp/Xqc97Skks37fbn8LZdRqdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQJdyd/btsHUcx9Tjp/Xqc97Skks37fbn8LZdRqdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQJdyd/btsHUcx9Tjp/Xqc97Skks37fbn8LZdRqdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQJdyd%2FbtsHUcx9Tjp%2FXqc97Skks37fbn8LZdRqdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1878&quot; height=&quot;798&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;798&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다마고치 게임입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다이얼을 돌려서 간단한 게임을 할 수 있게 했습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;생각보다 저장용량이 매우 작아서 힘들었던 기억이 납니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;포켓몬 게임&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1950&quot; data-origin-height=&quot;841&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0YDAp/btsHVKfQVM9/A4KHHMO1LpXlRK840MuFtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0YDAp/btsHVKfQVM9/A4KHHMO1LpXlRK840MuFtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0YDAp/btsHVKfQVM9/A4KHHMO1LpXlRK840MuFtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0YDAp%2FbtsHVKfQVM9%2FA4KHHMO1LpXlRK840MuFtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1950&quot; height=&quot;841&quot; data-origin-width=&quot;1950&quot; data-origin-height=&quot;841&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;포켓몬 게임입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;마찬가지로 다이얼을 돌리면 그 화면을 띄우고 클릭시 포켓몬을 잡는 연출을 만들었습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;적외선 센서 주크박스&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1924&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chUkKT/btsHU9NYKc1/QyvSE31TS2OQUVd0QhJkX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chUkKT/btsHU9NYKc1/QyvSE31TS2OQUVd0QhJkX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chUkKT/btsHU9NYKc1/QyvSE31TS2OQUVd0QhJkX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchUkKT%2FbtsHU9NYKc1%2FQyvSE31TS2OQUVd0QhJkX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1924&quot; height=&quot;765&quot; data-origin-width=&quot;1924&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;주크박스입니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;적외선을 감지하면 음악이 재생되도록 코딩하였습니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;불필요한 상황에서는 작동하지 않게 하는 것이 목표였습니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;반복 코드는 복사하여 붙여넣기 하면 정말 쉬운 코드인데, 복사하여 붙여넣기가 지원되지 않더군요. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그래서 음계표를 참고하여 직접 일일이 코딩하였습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;감옥문&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtdrqI/btsHVUifX8a/sS8b5m3HvHyIy4ouUCHHCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtdrqI/btsHVUifX8a/sS8b5m3HvHyIy4ouUCHHCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtdrqI/btsHVUifX8a/sS8b5m3HvHyIy4ouUCHHCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtdrqI%2FbtsHVUifX8a%2FsS8b5m3HvHyIy4ouUCHHCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1274&quot; height=&quot;639&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;639&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;감옥문입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;원격에서 버튼을 눌러 문을 열고 닫고 할 수 있게 해놨습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;재난 관리 시스템&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1936&quot; data-origin-height=&quot;791&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HA2bD/btsHUgUP4ch/ieqVYQmO7A5fetlPrLFxkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HA2bD/btsHUgUP4ch/ieqVYQmO7A5fetlPrLFxkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HA2bD/btsHUgUP4ch/ieqVYQmO7A5fetlPrLFxkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHA2bD%2FbtsHUgUP4ch%2FieqVYQmO7A5fetlPrLFxkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1936&quot; height=&quot;791&quot; data-origin-width=&quot;1936&quot; data-origin-height=&quot;791&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;재난 관리 시스템입니다.&lt;br /&gt;재난 관리에서 초음파를 이용하여 일정 이상의 거리에 물체가 감지되거나 흔들림이 일정 시간 이상 지속, 죄수가 도망가는 등 시민들이 위험할 상황이 발생된다면 버저를 통해 사람들에게 알리고 근처에 있는 사람들을 위해 스피커에서 소리가 나고 led가 빛나면서 위험을 알려 사람들이 위험에서 보다 빠르게 대처를 할수 있게 하기 위해 만들었습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;감옥에서는 버튼을 이용하여 원거리에서 감옥 문을 열고 닫게 관리할 수 있는 시스템을 가지게 했습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;직접 감옥에 있는 죄수들을 관리할때 보다 안전하게 통제를 할 수있게 하기 위해 만들었습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;금고&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2058&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEwVVe/btsHXt6tUIA/p0FPiPPKYCDeAdhuxIhYt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEwVVe/btsHXt6tUIA/p0FPiPPKYCDeAdhuxIhYt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEwVVe/btsHXt6tUIA/p0FPiPPKYCDeAdhuxIhYt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEwVVe%2FbtsHXt6tUIA%2Fp0FPiPPKYCDeAdhuxIhYt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2058&quot; height=&quot;828&quot; data-origin-width=&quot;2058&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;금고입니다.&amp;nbsp;&lt;br /&gt;랜덤으로 생성된 비밀번호를 맞추면 문이 열리게 되어있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;제가 짠 코드가 아니라서 자세히는 모르겠네요.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;무인 주차 및 정산 시스템&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T0v3y/btsHW92pgXA/azHI74DOfw2MVw7EFLBHU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T0v3y/btsHW92pgXA/azHI74DOfw2MVw7EFLBHU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T0v3y/btsHW92pgXA/azHI74DOfw2MVw7EFLBHU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT0v3y%2FbtsHW92pgXA%2FazHI74DOfw2MVw7EFLBHU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1072&quot; height=&quot;810&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;무인 주차 및 정산 시스템입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;제가 주력으로 담당했던 코드입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;센서를 인식하면 차가 있다는 것을 알리기 위해 led를 빨간불로 변경하고, 주차 중인 차량이 없으면 초록불로 상황을 알립니다. 와이파이를 연결하여 조이스틱을 올리면 문이 열리고 이때까지 누적된 금액을 5초 동안 알려줍니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;지금보면 정말 단순한 코드입니다. 하지만 저 당시 for문과 while문도 어려웠던 시절이라 애를 먹었던 기억이 있습니다. 지금보니 정말 좋은 추억이네요.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;가로등&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ANAeR/btsHXSFA5c7/JcNJtR92xZNQEdVxpneoX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ANAeR/btsHXSFA5c7/JcNJtR92xZNQEdVxpneoX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ANAeR/btsHXSFA5c7/JcNJtR92xZNQEdVxpneoX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FANAeR%2FbtsHXSFA5c7%2FJcNJtR92xZNQEdVxpneoX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1163&quot; height=&quot;574&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;가로등입니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;환경 센서를 이용해서 어두워지면 자동으로 불이켜지는 코드입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;신호위반 감지 시스템과 신호등&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1854&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZMMJN/btsHYH4xaSd/5r4vDNo2orkd2uTu0gUdfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZMMJN/btsHYH4xaSd/5r4vDNo2orkd2uTu0gUdfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZMMJN/btsHYH4xaSd/5r4vDNo2orkd2uTu0gUdfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZMMJN%2FbtsHYH4xaSd%2F5r4vDNo2orkd2uTu0gUdfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1854&quot; height=&quot;718&quot; data-origin-width=&quot;1854&quot; data-origin-height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;신호위반 감지 시스템과 신호등입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;빨간불에 지나가면 경보음이 울립니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;느낀 점&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; 첫 프로젝트인 만큼, 이번 경험은 제게 매우 뜻깊은 시간이었습니다. 초기 3일간은 센서의 원리를 이해하고 학습하는 데 집중하였고, 이후에는 창의적인 아이디어를 구상하고 코딩 작업을 수행하는 데 전념했습니다. 이러한 과정은 저에게 큰 의미를 부여해주었고 다른 프로젝트를 수행하는데 도움이 되는 경험이였습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;특히, 다수의 대학이 참가한 대회에서 금상을 수상하게 된 것은 매우 영광스러운 일이었으며, 깊은 인상을 남긴 소중한 시간이었습니다. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;아쉬운 점&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;맥북 m1 이슈 : 맥북 m1칩을 사용하면 MODI 프로그램이 정상적으로 작동하지 않는 이슈가 있었습니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;해결방법 : 맥북에서 가상 윈도우 환경을 만들어서 코드를 짰습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;원인 불명 접촉 불안&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;와이파이 연결 시도시 연결이 너무 자주 끊기거나 불안정 하였습니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;모듈 자체에 오류라서 해결 방안이 없었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;하드웨어적 / 소프트웨어적 한계&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;하드웨어와 소프트웨어가 간단하거나 기능이 부족하여 더 많은 기능을 구현할 수 없었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;용량 이슈&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;코드가 길어지면 용량때문에 업로드가 불가능한 경우가 있었습니다. 용량이 조금 더 많았으면 좋겠습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;힘들었던 점&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;첫 발표에서, 조원 한 명이 예상보다 많은 시간을 소요하여 나머지 두 명의 조원들은 자신의 코드를 설명하지 못한 채 아쉬운 발표를 마무리해야 했습니다. 발표가 끝나자, 모두들 수상은 어렵다고 느꼈는지 체념하는 분위기였습니다. 남은 시간 동안 심사위원들이 각 조를 돌아다니며 평가를 진행하였습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;저는 이때가 마지막 기회라고 생각하여, 열정적으로 심사위원분들께 다가가 저희 코드에 대해 상세히 설명하고 시연을 하였습니다. 이러한 노력 덕분에 조원들로부터 칭찬을 받았고, 7일간의 고생 끝에 금상이라는 뜻깊은 보상을 받을 수 있었습니다. 이를 통해 마지막 순간까지 포기하지 않는 자세의 중요성을 배울 수 있었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1hAYX/btsHXuZrnrF/C3OMQ8R4SiFachkf4HEHk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1hAYX/btsHXuZrnrF/C3OMQ8R4SiFachkf4HEHk0/img.png&quot; data-alt=&quot;수고하셨습니다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1hAYX/btsHXuZrnrF/C3OMQ8R4SiFachkf4HEHk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1hAYX%2FbtsHXuZrnrF%2FC3OMQ8R4SiFachkf4HEHk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;497&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;497&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;수고하셨습니다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>MODI</category>
      <category>디지털 혁신공유대학사업(인공지능)</category>
      <category>럭스로보</category>
      <category>여름방학 ai 교육캠프</category>
      <author>Codey</author>
      <guid isPermaLink="true">https://minuk2.tistory.com/183</guid>
      <comments>https://minuk2.tistory.com/183#entry183comment</comments>
      <pubDate>Tue, 11 Jun 2024 16:03:48 +0900</pubDate>
    </item>
    <item>
      <title>[안드로이드 스튜디오] 서브 액티비티로부터 문자열 반환받기</title>
      <link>https://minuk2.tistory.com/182</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;575&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dES275/btsHSBKDgt9/SzA2MokRshmp74DYrvWxjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dES275/btsHSBKDgt9/SzA2MokRshmp74DYrvWxjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dES275/btsHSBKDgt9/SzA2MokRshmp74DYrvWxjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdES275%2FbtsHSBKDgt9%2FSzA2MokRshmp74DYrvWxjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;878&quot; height=&quot;575&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;575&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;XML&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1717929144912&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
    xmlns:tools=&quot;http://schemas.android.com/tools&quot;
    android:id=&quot;@+id/main&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    tools:context=&quot;.MainActivity&quot;
    android:orientation=&quot;vertical&quot;
    android:gravity=&quot;center&quot;&amp;gt;

    &amp;lt;Button
        android:id=&quot;@+id/button1&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:text=&quot;문자열 반환 받기&quot;&amp;gt;
    &amp;lt;/Button&amp;gt;
    &amp;lt;TextView
        android:id=&quot;@+id/text1&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:text=&quot;반환된 문자열&quot;&amp;gt;
    &amp;lt;/TextView&amp;gt;
&amp;lt;/LinearLayout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1717929172602&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    android:orientation=&quot;vertical&quot;&amp;gt;
    &amp;lt;EditText
        android:id=&quot;@+id/edittext1&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;wrap_content&quot;&amp;gt;
    &amp;lt;/EditText&amp;gt;

    &amp;lt;LinearLayout
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:orientation=&quot;horizontal&quot;
        android:layout_gravity=&quot;center&quot;&amp;gt;
        &amp;lt;Button
            android:id=&quot;@+id/bt_submit&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:text=&quot;입력 완료&quot;&amp;gt;&amp;lt;/Button&amp;gt;
        &amp;lt;Button
            android:id=&quot;@+id/bt_cancle&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:text=&quot;취소&quot;&amp;gt;&amp;lt;/Button&amp;gt;
    &amp;lt;/LinearLayout&amp;gt;
&amp;lt;/LinearLayout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;JAVA&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1717929265187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.a06_exercise;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {
    TextView text1;
    Button button1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);

        text1 = findViewById(R.id.text1);
        button1 = findViewById(R.id.button1);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivityForResult(intent, 0);
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            String str = data.getStringExtra(&quot;text&quot;);
            text1.setText(str);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1717929278434&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.a06_exercise;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {
    EditText editText1;
    Button bt_submit, bt_cancle;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        editText1 = findViewById(R.id.edittext1);
        bt_submit = findViewById(R.id.bt_submit);
        bt_cancle = findViewById(R.id.bt_cancle);

        bt_submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SecondActivity.this, MainActivity.class);
                intent.putExtra(&quot;text&quot;, editText1.getText().toString());
                setResult(RESULT_OK, intent);
                finish();
            }
        });

        bt_cancle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                editText1.setText(&quot;&quot;);
            }
        });
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;</description>
      <category>프로그래밍/XML | JAVA</category>
      <category>Java</category>
      <category>xml</category>
      <category>안드로이드스튜디오</category>
      <author>Codey</author>
      <guid isPermaLink="true">https://minuk2.tistory.com/182</guid>
      <comments>https://minuk2.tistory.com/182#entry182comment</comments>
      <pubDate>Sun, 9 Jun 2024 19:35:20 +0900</pubDate>
    </item>
    <item>
      <title>[안드로이드 스튜디오] 핀치 줌</title>
      <link>https://minuk2.tistory.com/181</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yGywH/btsHotlQeNh/gkkHbTsGPQbLpYO8b0W6i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yGywH/btsHotlQeNh/gkkHbTsGPQbLpYO8b0W6i0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yGywH/btsHotlQeNh/gkkHbTsGPQbLpYO8b0W6i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyGywH%2FbtsHotlQeNh%2FgkkHbTsGPQbLpYO8b0W6i0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1273&quot; height=&quot;724&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;MyImageView.java&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1715580322528&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.a09_45;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;

public class MyImageView extends View {
    private Drawable image;
    private ScaleGestureDetector gestureDetector;
    private float scale = 1.0f;

    public MyImageView(Context context) {
        super(context);
        image = context.getResources().getDrawable(R.drawable.window);
        setFocusable(true);
        image.setBounds(0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight());
        gestureDetector = new ScaleGestureDetector(context, new ScaleListener());
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.save();
        canvas.scale(scale, scale);
        image.draw(canvas);
        canvas.restore();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        gestureDetector.onTouchEvent(event);
        invalidate();
        return true;
    }

    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            scale *= detector.getScaleFactor();

            if (scale &amp;lt; 0.1f)
                scale = 0.1f;
            if (scale &amp;gt; 10.0f)
                scale = 10.0f;

            invalidate();
            return true;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;MainActivity.java&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1715580377799&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.a09_45;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyImageView(this));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;</description>
      <category>프로그래밍/XML | JAVA</category>
      <category>Java</category>
      <category>xml</category>
      <category>안드로이드 스튜디오</category>
      <author>Codey</author>
      <guid isPermaLink="true">https://minuk2.tistory.com/181</guid>
      <comments>https://minuk2.tistory.com/181#entry181comment</comments>
      <pubDate>Mon, 13 May 2024 15:06:44 +0900</pubDate>
    </item>
    <item>
      <title>[안드로이드 스튜디오] 그림판 만들기</title>
      <link>https://minuk2.tistory.com/180</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q2q1a/btsHmT7dHnh/ym2kILbjk9h6hGRXZhIb9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q2q1a/btsHmT7dHnh/ym2kILbjk9h6hGRXZhIb9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q2q1a/btsHmT7dHnh/ym2kILbjk9h6hGRXZhIb9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq2q1a%2FbtsHmT7dHnh%2Fym2kILbjk9h6hGRXZhIb9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;567&quot; height=&quot;456&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;SingleTouchView.java&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1715577482332&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.a09_45;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class SingleTouchView extends View {
    private Paint paint = new Paint();
    private Path path = new Path();

    public SingleTouchView(Context context, AttributeSet attrs) {
        super(context, attrs);

        paint.setAntiAlias(true);
        paint.setStrokeWidth(10f);
        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
    }

    protected void onDraw(Canvas canvas) {
        canvas.drawPath(path, paint);
    }

    public boolean onTouchEvent(MotionEvent event) {
        float eventX = event.getX();
        float eventY = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                path.moveTo(eventX, eventY);
                return true;
            case MotionEvent.ACTION_MOVE:
                path.lineTo(eventX, eventY);
                break;
            case MotionEvent.ACTION_UP:
                break;
            default:
                return false;
        }

        invalidate();
        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;MainActivity.java&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1715577528548&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.a09_45;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new SingleTouchView(this, null));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;</description>
      <category>프로그래밍/XML | JAVA</category>
      <category>Java</category>
      <category>xml</category>
      <category>안드로이드 스튜디오</category>
      <author>Codey</author>
      <guid isPermaLink="true">https://minuk2.tistory.com/180</guid>
      <comments>https://minuk2.tistory.com/180#entry180comment</comments>
      <pubDate>Mon, 13 May 2024 14:19:14 +0900</pubDate>
    </item>
    <item>
      <title>[안드로이드 스튜디오] 클릭하여 원 표시</title>
      <link>https://minuk2.tistory.com/179</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQTJHw/btsHnjK1LIW/mvsgPJHe2jRb3q7D1Jb590/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQTJHw/btsHnjK1LIW/mvsgPJHe2jRb3q7D1Jb590/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQTJHw/btsHnjK1LIW/mvsgPJHe2jRb3q7D1Jb590/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQTJHw%2FbtsHnjK1LIW%2FmvsgPJHe2jRb3q7D1Jb590%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;784&quot; height=&quot;707&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;CustomView.java&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1715576425571&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.a09_38;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class CustomView extends View {
    private List&amp;lt;Circle&amp;gt; circles = new ArrayList&amp;lt;&amp;gt;();
    private Paint paint;

    public CustomView(Context context) {
        super(context);
        paint = new Paint();
    }

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for(Circle circle : circles) {
            paint.setColor(circle.color);
            canvas.drawCircle(circle.x, circle.y, circle.radius, paint);
        }
    }

    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            Random random = new Random();
            float radius = random.nextInt(300);
            int color = Color.rgb (
                    random.nextInt(256),
                    random.nextInt(256),
                    random.nextInt(256)
            );
            float x = event.getX();
            float y = event.getY();

            circles.add(new Circle(x,y,radius,color));
            invalidate();
            return true;
        }
        return super.onTouchEvent(event);
    }

    private class Circle {
        float x, y, radius;
        int color;
        Circle(float x, float y, float radius, int color) {
            this.x = x;
            this.y = y;
            this.radius = radius;
            this.color = color;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;MainActivity.java&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1715576488034&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.a09_38;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        CustomView w = new CustomView(this);
        setContentView(w); // CustomView 객체를 화면에 표시합니다.
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/XML | JAVA</category>
      <category>Java</category>
      <category>xml</category>
      <category>안드로이드 스튜디오</category>
      <author>Codey</author>
      <guid isPermaLink="true">https://minuk2.tistory.com/179</guid>
      <comments>https://minuk2.tistory.com/179#entry179comment</comments>
      <pubDate>Mon, 13 May 2024 14:01:49 +0900</pubDate>
    </item>
    <item>
      <title>[안드로이드 스튜디오] 캔버스로 폰트 설정</title>
      <link>https://minuk2.tistory.com/178</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;197&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y4WcA/btsHmRnOAFA/UXmUQp2Tfj2ikW38Ybkw81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y4WcA/btsHmRnOAFA/UXmUQp2Tfj2ikW38Ybkw81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y4WcA/btsHmRnOAFA/UXmUQp2Tfj2ikW38Ybkw81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy4WcA%2FbtsHmRnOAFA%2FUXmUQp2Tfj2ikW38Ybkw81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;197&quot; height=&quot;225&quot; data-origin-width=&quot;197&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;JAVA&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1715574459985&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.a09_29;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); // activity_main.xml에서 레이아웃을 설정합니다.
        MyView w = new MyView(this); // 현재 컨텍스트를 전달하여 MyView의 인스턴스를 생성합니다.
        setContentView(w); // MyView를 액티비티의 콘텐츠 뷰로 설정합니다.
    }

    // MainActivity 내부에 MyView를 내부 클래스로 정의합니다.
    class MyView extends View {
        public MyView(Context context) {
            super(context);
            setBackgroundColor(Color.YELLOW); // MyView의 배경색을 노란색으로 설정합니다.
        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas); // 기본 그리기 동작을 수행하기 위해 상위 클래스 메서드를 호출합니다.
            Paint paint = new Paint(); // 그리기를 위한 새 Paint 객체를 생성합니다.
            paint.setAntiAlias(true); // 부드러운 가장자리를 위해 안티앨리어싱을 활성화합니다.
            paint.setTextSize(100); // 텍스트 크기를 100픽셀로 설정합니다.

            Typeface t; // 글꼴을 커스터마이징하기 위한 Typeface 변수를 선언합니다.

            t = Typeface.DEFAULT; // 기본 글꼴로 설정합니다.
            paint.setTypeface(t); // Paint 객체에 기본 글꼴을 적용합니다.
            canvas.drawText(&quot;DEFAULT 폰트&quot;, 10, 200, paint); // (10, 200) 좌표에 텍스트를 그립니다.

            t = Typeface.create(Typeface.SERIF, Typeface.ITALIC); // 세리프 글꼴을 이탤릭체로 생성합니다.
            paint.setTypeface(t); // Paint 객체에 이탤릭체 세리프 글꼴을 적용합니다.
            canvas.drawText(&quot;SERIF 폰트&quot;, 10, 300, paint); // (10, 300) 좌표에 텍스트를 그립니다.

            t = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD_ITALIC); // 산세리프 글꼴을 볼드 이탤릭체로 생성합니다.
            paint.setTypeface(t); // Paint 객체에 볼드 이탤릭체 산세리프 글꼴을 적용합니다.
            canvas.drawText(&quot;SANS_SERIF 폰트&quot;, 10, 400, paint); // (10, 400) 좌표에 텍스트를 그립니다.
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/XML | JAVA</category>
      <category>Java</category>
      <category>xml</category>
      <category>안드로이드 스튜디오</category>
      <author>Codey</author>
      <guid isPermaLink="true">https://minuk2.tistory.com/178</guid>
      <comments>https://minuk2.tistory.com/178#entry178comment</comments>
      <pubDate>Mon, 13 May 2024 13:28:14 +0900</pubDate>
    </item>
    <item>
      <title>[안드로이드 스튜디오] 기본 도형 그리기</title>
      <link>https://minuk2.tistory.com/177</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;248&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJZP4u/btsHbSNHfMI/BygZcZY8N1AZossk1HlrpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJZP4u/btsHbSNHfMI/BygZcZY8N1AZossk1HlrpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJZP4u/btsHbSNHfMI/BygZcZY8N1AZossk1HlrpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJZP4u%2FbtsHbSNHfMI%2FBygZcZY8N1AZossk1HlrpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;248&quot; height=&quot;347&quot; data-origin-width=&quot;248&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oY1Ou/btsHbs9xG1s/t7IuhmCIuak50LypdOCbMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oY1Ou/btsHbs9xG1s/t7IuhmCIuak50LypdOCbMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oY1Ou/btsHbs9xG1s/t7IuhmCIuak50LypdOCbMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoY1Ou%2FbtsHbs9xG1s%2Ft7IuhmCIuak50LypdOCbMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;626&quot; height=&quot;264&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;JAVA&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1715042370023&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.a09_11;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyView w = new MyView(this);
        setContentView(w);
    }
}

class MyView extends View {
    public MyView(Context context) {
        super(context);
        setBackgroundColor(Color.BLUE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);
        paint.setStrokeWidth(20);
        canvas.drawLine(100, 100, 700, 100, paint);
        canvas.drawRect(100, 300, 700, 700, paint);
        canvas.drawCircle(300, 1200, 200, paint);
        paint.setTextSize(80);
        canvas.drawText(&quot;This is a test.&quot;, 100, 900, paint);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;172&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ohDHN/btsHcmtX4uz/Z6IC9MoDFUeNnJJQKcyJ40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ohDHN/btsHcmtX4uz/Z6IC9MoDFUeNnJJQKcyJ40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ohDHN/btsHcmtX4uz/Z6IC9MoDFUeNnJJQKcyJ40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FohDHN%2FbtsHcmtX4uz%2FZ6IC9MoDFUeNnJJQKcyJ40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;172&quot; height=&quot;341&quot; data-origin-width=&quot;172&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5oJw8/btsHe3UwiTc/3cqFBQclkktqb5KvNyPc50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5oJw8/btsHe3UwiTc/3cqFBQclkktqb5KvNyPc50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5oJw8/btsHe3UwiTc/3cqFBQclkktqb5KvNyPc50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5oJw8%2FbtsHe3UwiTc%2F3cqFBQclkktqb5KvNyPc50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;574&quot; height=&quot;354&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1715043182319&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.a09_11;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyView w = new MyView(this);
        setContentView(w);
    }
}

class MyView extends View {
    public MyView(Context context) {
        super(context);
        setBackgroundColor(Color.BLUE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);
        canvas.drawColor(Color.BLUE);
//        paint.setStrokeWidth(20);
//        canvas.drawLine(100, 100, 700, 100, paint);
//        canvas.drawRect(100, 300, 700, 700, paint);
//        canvas.drawCircle(300, 1200, 200, paint);
//        paint.setTextSize(80);
//        canvas.drawText(&quot;This is a test.&quot;, 100, 900, paint);

        canvas.drawRoundRect(new RectF(30,50,330,550), 15, 15, paint);
        canvas.drawOval(new RectF(450,50,750,550),paint);
        paint.setColor(Color.RED);
        canvas.drawArc(new RectF(30,600,330,1100),360,1000,true,paint);
        paint.setColor(Color.YELLOW);
        float[] pts = {30,1250,300,1350,300,1350,60,1450,60,1450,360,1500};
        paint.setStrokeWidth(10);
        canvas.drawLines(pts, paint);


    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;</description>
      <category>Java</category>
      <category>xml</category>
      <category>안드로이드 스튜디오</category>
      <author>Codey</author>
      <guid isPermaLink="true">https://minuk2.tistory.com/177</guid>
      <comments>https://minuk2.tistory.com/177#entry177comment</comments>
      <pubDate>Tue, 7 May 2024 09:41:28 +0900</pubDate>
    </item>
  </channel>
</rss>