<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>1렙 개발자</title>
    <link>https://a-develop.tistory.com/</link>
    <description>파밍 중</description>
    <language>ko</language>
    <pubDate>Sat, 27 Jun 2026 06:03:30 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Adev</managingEditor>
    <item>
      <title>leetcode 448 Find All Numbers Disappeared in an Array [JAVA]</title>
      <link>https://a-develop.tistory.com/118</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리뷰&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1~n의 값을 넣은 list를 만든 후, 제시된 배열을 순회하는 반복문을 돌리고 list.contains()를 사용해 배열값의 포함 여부를 확인했다. 시간 초과 문제가 발생했고 이를 해결하기 위해 HashSet과 카운팅정렬로 다시 풀어보았다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간초과 : list.contains()사용&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; ---&amp;gt; 22ms : &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;set.contains()사용&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; ---&amp;gt; 3ms : 카운팅 정렬&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공부한 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작은 범위의 정수를 정렬할 땐 카운팅 정렬을 고려하자.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HashSet vs 카운팅 정렬 속도차이&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[gpt]&amp;nbsp; 두 알고리즘 모두 시간 복잡도가 O(N)입니다. 시간 복잡도가 같다고 해도, 실제로 실행 속도는 알고리즘의 구현 방식과 데이터 구조, 환경 등에 따라 달라질 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;카운팅 정렬이 더 빠른 이유는 다음과 같습니다:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;메모리 접근 속도&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;: 카운팅 정렬은 메모리 상에 연속된 위치에 접근하여 데이터를 처리하므로 CPU의 캐시 메모리를 효율적으로 활용할 수 있습니다. 이는 데이터 접근 속도를 빠르게 만듭니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;연산의 단순성&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;: 카운팅 정렬은 각 숫자의 등장 횟수를 직접 카운트하고, 이를 바탕으로 결과를 생성하는 단순한 연산을 수행합니다. 반면 HashSet은 해시 함수와 충돌 해결 등의 복잡한 내부 처리 과정이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: left;&quot; data-testid=&quot;conversation-turn-27&quot; data-scroll-anchor=&quot;false&quot;&gt;
&lt;div data-message-author-role=&quot;assistant&quot; data-message-id=&quot;d7b108e7-10e4-48be-920a-ad514802364f&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 정수 배열에 대해서는 카운팅 정렬이 보다 빠른 속도를 보이며, 일반적으로 HashSet을 사용한 방법보다 시간 효율성이 높습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;448.&amp;nbsp;Find&amp;nbsp;All&amp;nbsp;Numbers&amp;nbsp;Disappeared&amp;nbsp;in&amp;nbsp;an&amp;nbsp;Array &lt;br /&gt;Solved &lt;br /&gt;Easy &lt;br /&gt;Topics &lt;br /&gt;Companies &lt;br /&gt;Hint &lt;br /&gt;Given&amp;nbsp;an&amp;nbsp;array&amp;nbsp;nums&amp;nbsp;of&amp;nbsp;n&amp;nbsp;integers&amp;nbsp;where&amp;nbsp;nums[i]&amp;nbsp;is&amp;nbsp;in&amp;nbsp;the&amp;nbsp;range&amp;nbsp;[1,&amp;nbsp;n],&amp;nbsp;return&amp;nbsp;an&amp;nbsp;array&amp;nbsp;of&amp;nbsp;all&amp;nbsp;the&amp;nbsp;integers&amp;nbsp;in&amp;nbsp;the&amp;nbsp;range&amp;nbsp;[1,&amp;nbsp;n]&amp;nbsp;that&amp;nbsp;do&amp;nbsp;not&amp;nbsp;appear&amp;nbsp;in&amp;nbsp;nums. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Example&amp;nbsp;1: &lt;br /&gt;&lt;br /&gt;Input:&amp;nbsp;nums&amp;nbsp;=&amp;nbsp;[4,3,2,7,8,2,3,1] &lt;br /&gt;Output:&amp;nbsp;[5,6] &lt;br /&gt;Example&amp;nbsp;2: &lt;br /&gt;&lt;br /&gt;Input:&amp;nbsp;nums&amp;nbsp;=&amp;nbsp;[1,1] &lt;br /&gt;Output:&amp;nbsp;[2] &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Constraints: &lt;br /&gt;&lt;br /&gt;n&amp;nbsp;==&amp;nbsp;nums.length &lt;br /&gt;1&amp;nbsp;&amp;lt;=&amp;nbsp;n&amp;nbsp;&amp;lt;=&amp;nbsp;105 &lt;br /&gt;1&amp;nbsp;&amp;lt;=&amp;nbsp;nums[i]&amp;nbsp;&amp;lt;=&amp;nbsp;n &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Follow&amp;nbsp;up:&amp;nbsp;Could&amp;nbsp;you&amp;nbsp;do&amp;nbsp;it&amp;nbsp;without&amp;nbsp;extra&amp;nbsp;space&amp;nbsp;and&amp;nbsp;in&amp;nbsp;O(n)&amp;nbsp;runtime?&amp;nbsp;You&amp;nbsp;may&amp;nbsp;assume&amp;nbsp;the&amp;nbsp;returned&amp;nbsp;list&amp;nbsp;does&amp;nbsp;not&amp;nbsp;count&amp;nbsp;as&amp;nbsp;extra&amp;nbsp;space.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내 답안&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&lt;/b&gt; time over - list.contains()&lt;/p&gt;
&lt;pre id=&quot;code_1719031012030&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//time over
public List&amp;lt;Integer&amp;gt; findDisappearedNumbers(int[] nums) {
        ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    for(int i=1; i&amp;lt;=nums.length; i++){list.add(i);}
    for(int k : nums){if(list.contains(k)){list.remove(Integer.valueOf(k));}}
    return list;
    }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&lt;/b&gt; 22ms - set.contains()&lt;/p&gt;
&lt;pre id=&quot;code_1719031024185&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    //22ms - set.contains()
    class Solution {
    public List&amp;lt;Integer&amp;gt; findDisappearedNumbers(int[] nums) {
    HashSet&amp;lt;Integer&amp;gt; set = new HashSet&amp;lt;&amp;gt;();
    for(int i=1; i&amp;lt;=nums.length; i++){set.add(i);}
    for(int k : nums){if(set.contains(k)){set.remove(k);}}
    ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(set);
    return list;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.&lt;/b&gt; 3ms - 카운팅 정렬&lt;/p&gt;
&lt;pre id=&quot;code_1719031125972&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public List&amp;lt;Integer&amp;gt; findDisappearedNumbers(int[] nums) {
        ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
        int result[] = new int[nums.length+1];
        for(int i=0; i&amp;lt;nums.length; i++){result[nums[i]]++;}
        for(int i=0; i&amp;lt;nums.length+1; i++){if(result[i]==0&amp;amp;&amp;amp;i!=0){list.add(i);}}
        return list;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/118</guid>
      <comments>https://a-develop.tistory.com/118#entry118comment</comments>
      <pubDate>Sat, 22 Jun 2024 19:55:29 +0900</pubDate>
    </item>
    <item>
      <title>sql 문제풀이 조각 모음 [MYSQL]</title>
      <link>https://a-develop.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. !=&amp;nbsp; 사용 시 null은 포함되지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1713883554575&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- [!=2] : 2를 제외한 숫자만 출력
select name from Customer where referee_id != 2

-- [!=2 and is null] : 2가 아닌 수 + null 출력
select name from Customer where referee_id != 2 or referee_id is null&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. null이 아닌 값을 찾을 땐 is not null 을 사용한다. ( &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;!= null (x)&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;coalesce() : 해당 컬럼값이 null일 시 대체할 값을 설정한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1713904385154&quot; class=&quot;sql&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;coalesce(컬럼명, 대체값)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1713904519899&quot; class=&quot;sql&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;select Prices.product_id, coalesce(round(sum(price*units)/sum(units),2), 0) as average_price 
from Prices left outer join UnitsSold
on Prices.product_id = UnitsSold.product_id and purchase_date between start_date and end_date 
group by product_id&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. where 절에 집계함수를 사용할 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WHERE 절은 개별 행의 조건을 검사하는 것이 아니라 행 자체를 필터링한다. 집계 함수는 행 단위가 아닌 그룹 단위로 작동하기 때문에 WHERE 절에서는 그룹화된 결과에 대한 조건을 지정할 수 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1714917192054&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--count(activity_type)&amp;gt;0 를 where 절에 넣을 시 오류 발생 &quot;Invalid use of group function&quot;

select activity_date as day, count(DISTINCT user_id) as active_users from Activity 
where activity_date between '2019-06-28' and '2019-07-27' 
group by activity_date having count(activity_type)&amp;gt;0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. count(*) : 해당 컬럼의 행의 수&lt;/p&gt;
&lt;pre id=&quot;code_1715352369494&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- a number that appeared only once in the MyNumbers table.

select num from MyNumbers group by num having count(*)=1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 문제&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;619.&amp;nbsp;Biggest&amp;nbsp;Single&amp;nbsp;Number &lt;br /&gt;Solved &lt;br /&gt;Easy &lt;br /&gt;Topics &lt;br /&gt;Companies &lt;br /&gt;SQL&amp;nbsp;Schema &lt;br /&gt;Pandas&amp;nbsp;Schema &lt;br /&gt;Table:&amp;nbsp;MyNumbers &lt;br /&gt;&lt;br /&gt;+-------------+------+ &lt;br /&gt;|&amp;nbsp;Column&amp;nbsp;Name&amp;nbsp;|&amp;nbsp;Type&amp;nbsp;| &lt;br /&gt;+-------------+------+ &lt;br /&gt;|&amp;nbsp;num&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;int&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+-------------+------+ &lt;br /&gt;This&amp;nbsp;table&amp;nbsp;may&amp;nbsp;contain&amp;nbsp;duplicates&amp;nbsp;(In&amp;nbsp;other&amp;nbsp;words,&amp;nbsp;there&amp;nbsp;is&amp;nbsp;no&amp;nbsp;primary&amp;nbsp;key&amp;nbsp;for&amp;nbsp;this&amp;nbsp;table&amp;nbsp;in&amp;nbsp;SQL). &lt;br /&gt;Each&amp;nbsp;row&amp;nbsp;of&amp;nbsp;this&amp;nbsp;table&amp;nbsp;contains&amp;nbsp;an&amp;nbsp;integer. &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;A&amp;nbsp;single&amp;nbsp;number&amp;nbsp;is&amp;nbsp;a&amp;nbsp;number&amp;nbsp;that&amp;nbsp;appeared&amp;nbsp;only&amp;nbsp;once&amp;nbsp;in&amp;nbsp;the&amp;nbsp;MyNumbers&amp;nbsp;table. &lt;br /&gt;&lt;br /&gt;Find&amp;nbsp;the&amp;nbsp;largest&amp;nbsp;single&amp;nbsp;number.&amp;nbsp;If&amp;nbsp;there&amp;nbsp;is&amp;nbsp;no&amp;nbsp;single&amp;nbsp;number,&amp;nbsp;report&amp;nbsp;null. &lt;br /&gt;&lt;br /&gt;The&amp;nbsp;result&amp;nbsp;format&amp;nbsp;is&amp;nbsp;in&amp;nbsp;the&amp;nbsp;following&amp;nbsp;example. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Example&amp;nbsp;1: &lt;br /&gt;&lt;br /&gt;Input:&amp;nbsp; &lt;br /&gt;MyNumbers&amp;nbsp;table: &lt;br /&gt;+-----+ &lt;br /&gt;|&amp;nbsp;num&amp;nbsp;| &lt;br /&gt;+-----+ &lt;br /&gt;|&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;4&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;5&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;6&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+-----+ &lt;br /&gt;Output:&amp;nbsp; &lt;br /&gt;+-----+ &lt;br /&gt;|&amp;nbsp;num&amp;nbsp;| &lt;br /&gt;+-----+ &lt;br /&gt;|&amp;nbsp;6&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+-----+ &lt;br /&gt;Explanation:&amp;nbsp;The&amp;nbsp;single&amp;nbsp;numbers&amp;nbsp;are&amp;nbsp;1,&amp;nbsp;4,&amp;nbsp;5,&amp;nbsp;and&amp;nbsp;6. &lt;br /&gt;Since&amp;nbsp;6&amp;nbsp;is&amp;nbsp;the&amp;nbsp;largest&amp;nbsp;single&amp;nbsp;number,&amp;nbsp;we&amp;nbsp;return&amp;nbsp;it. &lt;br /&gt;Example&amp;nbsp;2: &lt;br /&gt;&lt;br /&gt;Input:&amp;nbsp; &lt;br /&gt;MyNumbers&amp;nbsp;table: &lt;br /&gt;+-----+ &lt;br /&gt;|&amp;nbsp;num&amp;nbsp;| &lt;br /&gt;+-----+ &lt;br /&gt;|&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+-----+ &lt;br /&gt;Output:&amp;nbsp; &lt;br /&gt;+------+ &lt;br /&gt;|&amp;nbsp;num&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+------+ &lt;br /&gt;|&amp;nbsp;null&amp;nbsp;| &lt;br /&gt;+------+ &lt;br /&gt;Explanation:&amp;nbsp;There&amp;nbsp;are&amp;nbsp;no&amp;nbsp;single&amp;nbsp;numbers&amp;nbsp;in&amp;nbsp;the&amp;nbsp;input&amp;nbsp;table&amp;nbsp;so&amp;nbsp;we&amp;nbsp;return&amp;nbsp;null.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. concat(문자열A, 문자열B) / substr(문자열, 시작위치, 문자길이)&lt;/p&gt;
&lt;pre id=&quot;code_1715701432769&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- concatenate 문자 연결하기
-- substring 문자 자르기

select user_id, concat(upper(substr(name, 1, 1)), lower(substr(name, 2))) as name from Users 
order by user_id&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 공백 포함 문자 찾기 - % 문자%&lt;/p&gt;
&lt;pre id=&quot;code_1715701293745&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 'conditions' contains 0 or more code separated by spaces. 
--  Type I Diabetes always starts with DIAB1 prefix.

SELECT patient_id, patient_name, conditions FROM Patients
WHERE conditions LIKE 'DIAB1%' OR conditions LIKE '% DIAB1%' OR conditions LIKE 'DIAB1% %';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. delete문은 해당하는 행(레코드) 전체 또는 테이블 전체를 삭제할 때 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DELETE 문은 데이터베이스에서 레코드를 삭제할 때 사용된다. 보통은 특정 조건에 해당하는 레코드를 삭제하거나, 테이블의 모든 레코드를 삭제할 때 사용된다. 특정 컬럼을 모두 삭제하려면 DELETE 문이 아닌 ALTER TABLE 문을 사용해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1715867271174&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(x)
DELETE p1.id ~

(o)
ALTER TABLE Person
DROP COLUMN id;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. group_concat(컬럼명 order by 컬럼명)&lt;/p&gt;
&lt;pre id=&quot;code_1715867473607&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- group_concat : 그룹 내의 값들을 콤마를 사용해 하나의 문자열로 합쳐준다.

select sell_date, count(distinct product) as num_sold, 
group_concat(distinct product order by product) as products 
from Activities group by sell_date order by sell_date

| sell_date  | num_sold | products                     |
| ---------- | -------- | ---------------------------- |
| 2020-05-30 | 3        | Basketball,Headphone,T-Shirt |
| 2020-06-01 | 2        | Bible,Pencil                 |
| 2020-06-02 | 1        | Mask                         |&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. in 연산자 뒤의 서브쿼리는 한 컬럼의 값만 추출해야 한다. 여러 컬럼이 있을 시 비교 불가.&lt;/p&gt;
&lt;pre id=&quot;code_1716167016864&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select name from Employee where id in 
(select managerId from 
(select managerId, count(managerId) from Employee group by managerId having count(managerId)&amp;gt;=5) as t1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. 날짜 포맷 설정&lt;/p&gt;
&lt;pre id=&quot;code_1716310869514&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--mysql
date_format(trans_date, '%Y-%m-%d')
 
 --oracle
 to_char(trans_date, 'yyyy-mm-dd')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. 별칭 주의.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;from -&amp;gt; on,join -&amp;gt; where -&amp;gt; gruop by, having -&amp;gt; select -&amp;gt; distinct -&amp;gt; order by 순으로 수행되기 때문에&amp;nbsp; select절의 별칭은 group by와 where절에서 사용할 수 없다. 필드를 직접 비교하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(mysql에선 가능)&lt;/p&gt;
&lt;pre id=&quot;code_1716311948116&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(x)
select to_char(trans_date, 'yyyy-mm') as month from Transactions group by month

(o)
select to_char(trans_date, 'yyyy-mm') as month from Transactions 
group by to_char(trans_date, 'yyyy-mm')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. having 절에서는 집계된 열만 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;having 절은 그룹화된 결과 집합에 대한 필터링을 수행하는데, 이 때 having 절 내에서는 집계 함수를 사용하여 계산된 값에 대한 조건을 지정할 수 있다. 집계 함수인 sum, count, min, max등이 사용된 후에 조건을 걸어야 하며, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;집계 함수 외의 다른 열은 having절에서 직접적으로 참조할 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집계 함수를 사용하여 계산된 결과값만을 조건으로 지정해야 하며, 집계 함수 외의 열을 사용해야 한다면, 이를 where절에서 처리해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1716508116425&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(x) 
having s1.year = s2.first_year
-- s1.year 컬럼은 집계 함수가 아니므로 이 위치에 사용될 수 없다.

(x)
having min(order_date) = customer_pref_delivery_date
-- customer_pref_delivery_date는 집계 함수가 아니라 개별 레코드의 필드다. 따라서 HAVING 절에서 직접적으로 참조할 수 없다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;14. group by 절에 집계함수를 직접 사용할 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;group by &amp;nbsp;절은 일반적으로 집계 함수가 아닌 열을 기준으로 그룹화하는 데 사용된다. &lt;br /&gt;&lt;br /&gt;15.&amp;nbsp;동일한 조건을 on 조건절에 두는 것과 where 조건절에 두는 것, 이 둘의 결과는 다를 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;on 절은 전체 테이블 비교하고, where 절은 해당 행별로 비교한다.&lt;br /&gt;on 절은 두 테이블 간의 관계를 설정하고 특정 조인 조건을 지정하는 데 사용되며, 이것은 전체 테이블 간의 비교를 의미한다. 반면에 where 절은 이미 결합된 결과에 대해 특정 조건을 적용하여 결과를 필터링하는 데 사용되며, 이것은 각 행에 대한 비교를 의미한다.&lt;br /&gt;즉, on 절은 결합된 결과를 만들기 위해 전체 테이블 간의 관계를 설정하고, where 절은 이미 결합된 결과에서 각 행에 대해 추가적인 조건을 적용하여 결과를 필터링하는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1716507457679&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select s1.product_id, first_year, quantity, price 
from Sales s1 join (select product_id, min(year) as first_year from Sales group by product_id) as s2 
on s1.product_id = s2.product_id where s1.year = s2.first_year&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시문제&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1070.&amp;nbsp;Product&amp;nbsp;Sales&amp;nbsp;Analysis&amp;nbsp;III &lt;br /&gt;Solved &lt;br /&gt;Medium &lt;br /&gt;Topics &lt;br /&gt;Companies &lt;br /&gt;SQL&amp;nbsp;Schema &lt;br /&gt;Pandas&amp;nbsp;Schema &lt;br /&gt;Table:&amp;nbsp;Sales &lt;br /&gt;&lt;br /&gt;+-------------+-------+ &lt;br /&gt;|&amp;nbsp;Column&amp;nbsp;Name&amp;nbsp;|&amp;nbsp;Type&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+-------------+-------+ &lt;br /&gt;|&amp;nbsp;sale_id&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;int&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;product_id&amp;nbsp;&amp;nbsp;|&amp;nbsp;int&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;year&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;int&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;quantity&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;int&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;price&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;int&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+-------------+-------+ &lt;br /&gt;(sale_id,&amp;nbsp;year)&amp;nbsp;is&amp;nbsp;the&amp;nbsp;primary&amp;nbsp;key&amp;nbsp;(combination&amp;nbsp;of&amp;nbsp;columns&amp;nbsp;with&amp;nbsp;unique&amp;nbsp;values)&amp;nbsp;of&amp;nbsp;this&amp;nbsp;table. &lt;br /&gt;product_id&amp;nbsp;is&amp;nbsp;a&amp;nbsp;foreign&amp;nbsp;key&amp;nbsp;(reference&amp;nbsp;column)&amp;nbsp;to&amp;nbsp;Product&amp;nbsp;table. &lt;br /&gt;Each&amp;nbsp;row&amp;nbsp;of&amp;nbsp;this&amp;nbsp;table&amp;nbsp;shows&amp;nbsp;a&amp;nbsp;sale&amp;nbsp;on&amp;nbsp;the&amp;nbsp;product&amp;nbsp;product_id&amp;nbsp;in&amp;nbsp;a&amp;nbsp;certain&amp;nbsp;year. &lt;br /&gt;Note&amp;nbsp;that&amp;nbsp;the&amp;nbsp;price&amp;nbsp;is&amp;nbsp;per&amp;nbsp;unit. &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Table:&amp;nbsp;Product &lt;br /&gt;&lt;br /&gt;+--------------+---------+ &lt;br /&gt;|&amp;nbsp;Column&amp;nbsp;Name&amp;nbsp;&amp;nbsp;|&amp;nbsp;Type&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+--------------+---------+ &lt;br /&gt;|&amp;nbsp;product_id&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;product_name&amp;nbsp;|&amp;nbsp;varchar&amp;nbsp;| &lt;br /&gt;+--------------+---------+ &lt;br /&gt;product_id&amp;nbsp;is&amp;nbsp;the&amp;nbsp;primary&amp;nbsp;key&amp;nbsp;(column&amp;nbsp;with&amp;nbsp;unique&amp;nbsp;values)&amp;nbsp;of&amp;nbsp;this&amp;nbsp;table. &lt;br /&gt;Each&amp;nbsp;row&amp;nbsp;of&amp;nbsp;this&amp;nbsp;table&amp;nbsp;indicates&amp;nbsp;the&amp;nbsp;product&amp;nbsp;name&amp;nbsp;of&amp;nbsp;each&amp;nbsp;product. &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Write&amp;nbsp;a&amp;nbsp;solution&amp;nbsp;to&amp;nbsp;select&amp;nbsp;the&amp;nbsp;product&amp;nbsp;id,&amp;nbsp;year,&amp;nbsp;quantity,&amp;nbsp;and&amp;nbsp;price&amp;nbsp;for&amp;nbsp;the&amp;nbsp;first&amp;nbsp;year&amp;nbsp;of&amp;nbsp;every&amp;nbsp;product&amp;nbsp;sold. &lt;br /&gt;&lt;br /&gt;Return&amp;nbsp;the&amp;nbsp;resulting&amp;nbsp;table&amp;nbsp;in&amp;nbsp;any&amp;nbsp;order. &lt;br /&gt;&lt;br /&gt;The&amp;nbsp;result&amp;nbsp;format&amp;nbsp;is&amp;nbsp;in&amp;nbsp;the&amp;nbsp;following&amp;nbsp;example. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Example&amp;nbsp;1: &lt;br /&gt;&lt;br /&gt;Input:&amp;nbsp; &lt;br /&gt;Sales&amp;nbsp;table: &lt;br /&gt;+---------+------------+------+----------+-------+ &lt;br /&gt;|&amp;nbsp;sale_id&amp;nbsp;|&amp;nbsp;product_id&amp;nbsp;|&amp;nbsp;year&amp;nbsp;|&amp;nbsp;quantity&amp;nbsp;|&amp;nbsp;price&amp;nbsp;| &lt;br /&gt;+---------+------------+------+----------+-------+&amp;nbsp; &lt;br /&gt;|&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;2008&amp;nbsp;|&amp;nbsp;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;5000&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;2009&amp;nbsp;|&amp;nbsp;12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;5000&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;200&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;2011&amp;nbsp;|&amp;nbsp;15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;9000&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+---------+------------+------+----------+-------+ &lt;br /&gt;Product&amp;nbsp;table: &lt;br /&gt;+------------+--------------+ &lt;br /&gt;|&amp;nbsp;product_id&amp;nbsp;|&amp;nbsp;product_name&amp;nbsp;| &lt;br /&gt;+------------+--------------+ &lt;br /&gt;|&amp;nbsp;100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Nokia&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;200&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Apple&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;300&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Samsung&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+------------+--------------+ &lt;br /&gt;Output:&amp;nbsp; &lt;br /&gt;+------------+------------+----------+-------+ &lt;br /&gt;|&amp;nbsp;product_id&amp;nbsp;|&amp;nbsp;first_year&amp;nbsp;|&amp;nbsp;quantity&amp;nbsp;|&amp;nbsp;price&amp;nbsp;| &lt;br /&gt;+------------+------------+----------+-------+&amp;nbsp; &lt;br /&gt;|&amp;nbsp;100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;5000&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;200&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;2011&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;9000&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+------------+------------+----------+-------+&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. mysql에서는 일반적으로 찾는 값이 없을 경우 빈 결과를 반환한다. 단, 서브쿼리가 빈 결과를 반환할 경우 외부 쿼리에서는 null을 반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1716653481068&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select (select distinct salary from Employee order by salary desc limit 1 offset 1) as SecondHighestSalary

-- 서브쿼리 결과 : 빈칸 
-- 외부쿼리 결과 : null&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/117</guid>
      <comments>https://a-develop.tistory.com/117#entry117comment</comments>
      <pubDate>Wed, 22 May 2024 02:26:29 +0900</pubDate>
    </item>
    <item>
      <title>leetcode 1517 Find Users With Valid E-Mails﻿ [MYSQL]</title>
      <link>https://a-develop.tistory.com/116</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리뷰&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공부한 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;RLIKE, REGEX&lt;span&gt; 함수 - 문자열 패턴을 정규표현식을 사용해서 비교하고 일치 여부를 확인한다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716152298411&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- regular like, regular expression

RLIKE '^[조건 범위]'
REGEX '^[조건 범위]'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;color: #333333; text-align: left;&quot;&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;정규표현식&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716151787304&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a-zA-Z : 알파벳
0-9 : 숫자

^ : 문자열 시작 표시
[] : 범위 설정
+ : 조건 잇기
$ : 문자열 종료 설정. 설정하지 않으면 뒤에 문자열이 추가될 수 있다.
* : 직전의 조건 범위를 충족하는 문자의 개수는 0 이상이다.

\\. : 메타문자인 도트 앞에 이스케이프 문자(역슬래시) 두개 붙이기&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Table: Users&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| user_id       | int     |
| name          | varchar |
| mail          | varchar |
+---------------+---------+
user_id is the primary key (column with unique values) for this table.
This table contains information of the users signed up in a website. Some e-mails are invalid.

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Write a solution to find the users who have&amp;nbsp;&lt;b&gt;valid emails&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A valid e-mail has a prefix name and a domain where:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;The prefix name&lt;/b&gt;&amp;nbsp;is a string that may contain letters (upper or lower case), digits, underscore&amp;nbsp;'_', period&amp;nbsp;'.', and/or dash&amp;nbsp;'-'. The prefix name&amp;nbsp;&lt;b&gt;must&lt;/b&gt;&amp;nbsp;start with a letter.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;The domain&lt;/b&gt;&amp;nbsp;is&amp;nbsp;'@leetcode.com'.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Return the result table in&amp;nbsp;&lt;b&gt;any order&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The result format is in the following example.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;Input:
Users table:
+---------+-----------+-------------------------+
| user_id | name      | mail                    |
+---------+-----------+-------------------------+
| 1       | Winston   | winston@leetcode.com    |
| 2       | Jonathan  | jonathanisgreat         |
| 3       | Annabelle | bella-@leetcode.com     |
| 4       | Sally     | sally.come@leetcode.com |
| 5       | Marwan    | quarz#2020@leetcode.com |
| 6       | David     | david69@gmail.com       |
| 7       | Shapiro   | .shapo@leetcode.com     |
+---------+-----------+-------------------------+
Output:
+---------+-----------+-------------------------+
| user_id | name      | mail                    |
+---------+-----------+-------------------------+
| 1       | Winston   | winston@leetcode.com    |
| 3       | Annabelle | bella-@leetcode.com     |
| 4       | Sally     | sally.come@leetcode.com |
+---------+-----------+-------------------------+
Explanation:
The mail of user 2 does not have a domain.
The mail of user 5 has the # sign which is not allowed.
The mail of user 6 does not have the leetcode domain.
The mail of user 7 starts with a period.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내 답안&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1716132801371&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select user_id, name, mail from Users 
where mail rlike '^[a-zA-Z][a-zA-Z0-9_.-]*+@leetcode\\.com$'&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/116</guid>
      <comments>https://a-develop.tistory.com/116#entry116comment</comments>
      <pubDate>Mon, 20 May 2024 05:58:33 +0900</pubDate>
    </item>
    <item>
      <title>leetcode 1731 The Number of Employees Which Report to Each Employee [MYSQL]</title>
      <link>https://a-develop.tistory.com/115</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리뷰&lt;/b&gt;&lt;/h3&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #555555; text-align: start;&quot;&gt;&quot;the number of employees who report directly to them&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp; by managers&quot; 이 부분이 문제였는데, count(reports_to)로 적으니 group by에 적용돼서 0 출력. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;서브쿼리를 사용해서&amp;nbsp; count(employee_id)를 출력하려고 하니까 이경우엔 group by에 적용시킬 수가 없었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공부한 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;the average age of the reports rounded to the nearest integer.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반올림&lt;/p&gt;
&lt;pre id=&quot;code_1715351683108&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- CEILING (x)

round(avg(table2.age))&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1731.&amp;nbsp;The&amp;nbsp;Number&amp;nbsp;of&amp;nbsp;Employees&amp;nbsp;Which&amp;nbsp;Report&amp;nbsp;to&amp;nbsp;Each&amp;nbsp;Employee &lt;br /&gt;Solved &lt;br /&gt;Easy &lt;br /&gt;Topics &lt;br /&gt;Companies &lt;br /&gt;SQL&amp;nbsp;Schema &lt;br /&gt;Pandas&amp;nbsp;Schema &lt;br /&gt;Table:&amp;nbsp;Employees &lt;br /&gt;&lt;br /&gt;+-------------+----------+ &lt;br /&gt;|&amp;nbsp;Column&amp;nbsp;Name&amp;nbsp;|&amp;nbsp;Type&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+-------------+----------+ &lt;br /&gt;|&amp;nbsp;employee_id&amp;nbsp;|&amp;nbsp;int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;varchar&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;reports_to&amp;nbsp;&amp;nbsp;|&amp;nbsp;int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;age&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+-------------+----------+ &lt;br /&gt;employee_id&amp;nbsp;is&amp;nbsp;the&amp;nbsp;column&amp;nbsp;with&amp;nbsp;unique&amp;nbsp;values&amp;nbsp;for&amp;nbsp;this&amp;nbsp;table. &lt;br /&gt;This&amp;nbsp;table&amp;nbsp;contains&amp;nbsp;information&amp;nbsp;about&amp;nbsp;the&amp;nbsp;employees&amp;nbsp;and&amp;nbsp;the&amp;nbsp;id&amp;nbsp;of&amp;nbsp;the&amp;nbsp;manager&amp;nbsp;they&amp;nbsp;report&amp;nbsp;to.&amp;nbsp;Some&amp;nbsp;employees&amp;nbsp;do&amp;nbsp;not&amp;nbsp;report&amp;nbsp;to&amp;nbsp;anyone&amp;nbsp;(reports_to&amp;nbsp;is&amp;nbsp;null).&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;For&amp;nbsp;this&amp;nbsp;problem,&amp;nbsp;we&amp;nbsp;will&amp;nbsp;consider&amp;nbsp;a&amp;nbsp;manager&amp;nbsp;an&amp;nbsp;employee&amp;nbsp;who&amp;nbsp;has&amp;nbsp;at&amp;nbsp;least&amp;nbsp;1&amp;nbsp;other&amp;nbsp;employee&amp;nbsp;reporting&amp;nbsp;to&amp;nbsp;them. &lt;br /&gt;&lt;br /&gt;Write&amp;nbsp;a&amp;nbsp;solution&amp;nbsp;to&amp;nbsp;report&amp;nbsp;the&amp;nbsp;ids&amp;nbsp;and&amp;nbsp;the&amp;nbsp;names&amp;nbsp;of&amp;nbsp;all&amp;nbsp;managers,&amp;nbsp;the&amp;nbsp;number&amp;nbsp;of&amp;nbsp;employees&amp;nbsp;who&amp;nbsp;report&amp;nbsp;directly&amp;nbsp;to&amp;nbsp;them,&amp;nbsp;and&amp;nbsp;the&amp;nbsp;average&amp;nbsp;age&amp;nbsp;of&amp;nbsp;the&amp;nbsp;reports&amp;nbsp;rounded&amp;nbsp;to&amp;nbsp;the&amp;nbsp;nearest&amp;nbsp;integer. &lt;br /&gt;&lt;br /&gt;Return&amp;nbsp;the&amp;nbsp;result&amp;nbsp;table&amp;nbsp;ordered&amp;nbsp;by&amp;nbsp;employee_id. &lt;br /&gt;&lt;br /&gt;The&amp;nbsp;result&amp;nbsp;format&amp;nbsp;is&amp;nbsp;in&amp;nbsp;the&amp;nbsp;following&amp;nbsp;example. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Example&amp;nbsp;1: &lt;br /&gt;&lt;br /&gt;Input:&amp;nbsp; &lt;br /&gt;Employees&amp;nbsp;table: &lt;br /&gt;+-------------+---------+------------+-----+ &lt;br /&gt;|&amp;nbsp;employee_id&amp;nbsp;|&amp;nbsp;name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;reports_to&amp;nbsp;|&amp;nbsp;age&amp;nbsp;| &lt;br /&gt;+-------------+---------+------------+-----+ &lt;br /&gt;|&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Hercy&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;null&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;43&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Alice&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;41&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Bob&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;36&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Winston&amp;nbsp;|&amp;nbsp;null&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;37&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+-------------+---------+------------+-----+ &lt;br /&gt;Output:&amp;nbsp; &lt;br /&gt;+-------------+-------+---------------+-------------+ &lt;br /&gt;|&amp;nbsp;employee_id&amp;nbsp;|&amp;nbsp;name&amp;nbsp;&amp;nbsp;|&amp;nbsp;reports_count&amp;nbsp;|&amp;nbsp;average_age&amp;nbsp;| &lt;br /&gt;+-------------+-------+---------------+-------------+ &lt;br /&gt;|&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Hercy&amp;nbsp;|&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;39&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+-------------+-------+---------------+-------------+ &lt;br /&gt;Explanation:&amp;nbsp;Hercy&amp;nbsp;has&amp;nbsp;2&amp;nbsp;people&amp;nbsp;report&amp;nbsp;directly&amp;nbsp;to&amp;nbsp;him,&amp;nbsp;Alice&amp;nbsp;and&amp;nbsp;Bob.&amp;nbsp;Their&amp;nbsp;average&amp;nbsp;age&amp;nbsp;is&amp;nbsp;(41+36)/2&amp;nbsp;=&amp;nbsp;38.5,&amp;nbsp;which&amp;nbsp;is&amp;nbsp;39&amp;nbsp;after&amp;nbsp;rounding&amp;nbsp;it&amp;nbsp;to&amp;nbsp;the&amp;nbsp;nearest&amp;nbsp;integer. &lt;br /&gt;Example&amp;nbsp;2: &lt;br /&gt;&lt;br /&gt;Input:&amp;nbsp; &lt;br /&gt;Employees&amp;nbsp;table: &lt;br /&gt;+-------------+---------+------------+-----+&amp;nbsp; &lt;br /&gt;|&amp;nbsp;employee_id&amp;nbsp;|&amp;nbsp;name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;reports_to&amp;nbsp;|&amp;nbsp;age&amp;nbsp;| &lt;br /&gt;|-------------|---------|------------|-----| &lt;br /&gt;|&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Michael&amp;nbsp;|&amp;nbsp;null&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;45&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Alice&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;38&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Bob&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;42&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Charlie&amp;nbsp;|&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;34&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;David&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;40&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Eve&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;37&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Frank&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;null&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;50&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Grace&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;null&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;48&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+-------------+---------+------------+-----+&amp;nbsp; &lt;br /&gt;Output:&amp;nbsp; &lt;br /&gt;+-------------+---------+---------------+-------------+ &lt;br /&gt;|&amp;nbsp;employee_id&amp;nbsp;|&amp;nbsp;name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;reports_count&amp;nbsp;|&amp;nbsp;average_age&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;-----------&amp;nbsp;|&amp;nbsp;-------&amp;nbsp;|&amp;nbsp;-------------&amp;nbsp;|&amp;nbsp;-----------&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Michael&amp;nbsp;|&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;40&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Alice&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;37&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Bob&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;37&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+-------------+---------+---------------+-------------+&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내 답안&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1715350784339&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select table1.employee_id, table1.name, count(table2.reports_to) as reports_count, 
round(avg(table2.age)) as average_age from Employees as table1 left join Employees as table2 
on table1.employee_id= table2.reports_to group by table1.employee_id having table1.employee_id 
in (select distinct reports_to from Employees where reports_to is not null) 
order by employee_id&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/115</guid>
      <comments>https://a-develop.tistory.com/115#entry115comment</comments>
      <pubDate>Fri, 10 May 2024 23:31:17 +0900</pubDate>
    </item>
    <item>
      <title>leetcode 197 Rising Temperature [MYSQL]</title>
      <link>https://a-develop.tistory.com/114</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리뷰&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공부한 것&lt;/b&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;Lag() - 이전 행 값을 가져온다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713628036891&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LAG(값을 추출할 컬럼, 행 간격, default) OVER (PARTITION BY partition_col ORDER BY 기준 컬럼)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DATE_SUB() - 날짜, 시간 뺄셈&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713627274834&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;date_sub(날짜, interval 간격 day)
date_sub(시간, interval 간격 hour)

-- &amp;lt;-&amp;gt; date_add() 날짜, 시간 덧셈&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Every derived table must have its own alias&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브쿼리 테이블을 만든 후 이름을 붙여야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(서브쿼리 결과를 바로 사용하는 경우에는 별칭을 붙이지 않아도 되지만, 서브쿼리 결과를 후속 작업에서 참조하려는 경우에는 별칭이 필요할 수 있습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Unknown column 'temperature' in 'where clause'&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;where절이 from절의 서브쿼리 테이블을 기반으로 하기 때문에 필요한 속성(필드)를 서브쿼리 테이블에도 추가해야한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Table:&amp;nbsp;Weather &lt;br /&gt;&lt;br /&gt;+---------------+---------+ &lt;br /&gt;|&amp;nbsp;Column&amp;nbsp;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Type&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+---------------+---------+ &lt;br /&gt;|&amp;nbsp;id&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;recordDate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;date&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;temperature&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+---------------+---------+ &lt;br /&gt;id&amp;nbsp;is&amp;nbsp;the&amp;nbsp;column&amp;nbsp;with&amp;nbsp;unique&amp;nbsp;values&amp;nbsp;for&amp;nbsp;this&amp;nbsp;table. &lt;br /&gt;There&amp;nbsp;are&amp;nbsp;no&amp;nbsp;different&amp;nbsp;rows&amp;nbsp;with&amp;nbsp;the&amp;nbsp;same&amp;nbsp;recordDate. &lt;br /&gt;This&amp;nbsp;table&amp;nbsp;contains&amp;nbsp;information&amp;nbsp;about&amp;nbsp;the&amp;nbsp;temperature&amp;nbsp;on&amp;nbsp;a&amp;nbsp;certain&amp;nbsp;day. &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Write&amp;nbsp;a&amp;nbsp;solution&amp;nbsp;to&amp;nbsp;find&amp;nbsp;all&amp;nbsp;dates'&amp;nbsp;Id&amp;nbsp;with&amp;nbsp;higher&amp;nbsp;temperatures&amp;nbsp;compared&amp;nbsp;to&amp;nbsp;its&amp;nbsp;previous&amp;nbsp;dates&amp;nbsp;(yesterday). &lt;br /&gt;&lt;br /&gt;Return&amp;nbsp;the&amp;nbsp;result&amp;nbsp;table&amp;nbsp;in&amp;nbsp;any&amp;nbsp;order. &lt;br /&gt;&lt;br /&gt;The&amp;nbsp;result&amp;nbsp;format&amp;nbsp;is&amp;nbsp;in&amp;nbsp;the&amp;nbsp;following&amp;nbsp;example. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Example&amp;nbsp;1: &lt;br /&gt;&lt;br /&gt;Input:&amp;nbsp; &lt;br /&gt;Weather&amp;nbsp;table: &lt;br /&gt;+----+------------+-------------+ &lt;br /&gt;|&amp;nbsp;id&amp;nbsp;|&amp;nbsp;recordDate&amp;nbsp;|&amp;nbsp;temperature&amp;nbsp;| &lt;br /&gt;+----+------------+-------------+ &lt;br /&gt;|&amp;nbsp;1&amp;nbsp;&amp;nbsp;|&amp;nbsp;2015-01-01&amp;nbsp;|&amp;nbsp;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;2&amp;nbsp;&amp;nbsp;|&amp;nbsp;2015-01-02&amp;nbsp;|&amp;nbsp;25&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;3&amp;nbsp;&amp;nbsp;|&amp;nbsp;2015-01-03&amp;nbsp;|&amp;nbsp;20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;4&amp;nbsp;&amp;nbsp;|&amp;nbsp;2015-01-04&amp;nbsp;|&amp;nbsp;30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+----+------------+-------------+ &lt;br /&gt;Output:&amp;nbsp; &lt;br /&gt;+----+ &lt;br /&gt;|&amp;nbsp;id&amp;nbsp;| &lt;br /&gt;+----+ &lt;br /&gt;|&amp;nbsp;2&amp;nbsp;&amp;nbsp;| &lt;br /&gt;|&amp;nbsp;4&amp;nbsp;&amp;nbsp;| &lt;br /&gt;+----+ &lt;br /&gt;Explanation:&amp;nbsp; &lt;br /&gt;In&amp;nbsp;2015-01-02,&amp;nbsp;the&amp;nbsp;temperature&amp;nbsp;was&amp;nbsp;higher&amp;nbsp;than&amp;nbsp;the&amp;nbsp;previous&amp;nbsp;day&amp;nbsp;(10&amp;nbsp;-&amp;gt;&amp;nbsp;25). &lt;br /&gt;In&amp;nbsp;2015-01-04,&amp;nbsp;the&amp;nbsp;temperature&amp;nbsp;was&amp;nbsp;higher&amp;nbsp;than&amp;nbsp;the&amp;nbsp;previous&amp;nbsp;day&amp;nbsp;(20&amp;nbsp;-&amp;gt;&amp;nbsp;30).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내 답안&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1713624066178&quot; class=&quot;sql&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;select id 
from (select id, temperature, recordDate,  lag(recordDate) over(order by recordDate) as lagday, 
lag(temperature) over(order by recordDate) as lagTemperature, 
date_sub(recordDate, interval 1 day) as yesterday from Weather) as newTable 
where temperature &amp;gt; lagTemperature and lagday = yesterday&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/114</guid>
      <comments>https://a-develop.tistory.com/114#entry114comment</comments>
      <pubDate>Sun, 21 Apr 2024 00:56:30 +0900</pubDate>
    </item>
    <item>
      <title>백준 20920 영단어 암기는 괴로워 [JAVA]</title>
      <link>https://a-develop.tistory.com/113</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리뷰&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시간초과&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열과 중복 개수를 HashMap에 넣는 부분에서 시간 초과가 발생했다. List에 문자열을 모두 입력받은 후 Set에 저장해 중복을 제거하고 Set을 Iterator 반복문을 돌려 각 문자열이 원본 List에 몇개씩 있는지 체크했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간초과 문제를 해결하기 위해 getOrDefault메소드를 사용하여 입력과 동시에 빈도수를 카운트하도록 했다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공부한 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;getOrDefault(Object key, V DefaultValue)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: map에 key가 있으면 value리턴, 없으면 defalutValue리턴&lt;/p&gt;
&lt;pre id=&quot;code_1710798308966&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (word.length() &amp;gt;= m) {
				Integer count = hm.getOrDefault(word, 0);
				hm.put(word, count + 1);
			}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자 비교 : 래퍼클래스.compare(비교대상1, 비교대상2);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자 비교 : 비교대상1.compareTo( 비교대상2 );&lt;/p&gt;
&lt;pre id=&quot;code_1710799229793&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (hm.get(o1) != hm.get(o2)) {
				if (o1.length() != o2.length()) {
					return Integer.compare(o2.length(), o1.length());
					// return o2.length() - o1.length();
				}
				return o1.compareTo(o2);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;화은이는 이번 영어 시험에서 틀린 문제를 바탕으로 영어 단어 암기를 하려고 한다. 그 과정에서 효율적으로 영어 단어를 외우기 위해 영어 단어장을 만들려&amp;nbsp;하고 있다. 화은이가 만들고자 하는 단어장의 단어 순서는 다음과 같은 우선순위를 차례로 적용하여 만들어진다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;자주 나오는 단어일수록 앞에 배치한다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;해당 단어의 길이가 길수록 앞에 배치한다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;알파벳 사전 순으로 앞에 있는&amp;nbsp;단어일수록 앞에 배치한다&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt; �&lt;span aria-hidden=&quot;true&quot;&gt;$M$&lt;/span&gt;보다 짧은 길이의 단어의 경우 읽는 것만으로도 외울 수 있기 때문에 길이가&lt;span&gt;&amp;nbsp;&lt;/span&gt;�&lt;span aria-hidden=&quot;true&quot;&gt;$M$&lt;/span&gt;이상인 단어들만 외운다고 한다. 화은이가 괴로운 영단어 암기를 효율적으로 할 수 있도록 단어장을 만들어 주자.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에는 영어 지문에 나오는 단어의 개수&lt;span&gt;&amp;nbsp;&lt;/span&gt;�&lt;span aria-hidden=&quot;true&quot;&gt;$N$&lt;/span&gt;과 외울 단어의 길이 기준이 되는&lt;span&gt;&amp;nbsp;&lt;/span&gt;�&lt;span aria-hidden=&quot;true&quot;&gt;$M$&lt;/span&gt;이 공백으로 구분되어 주어진다. (1&amp;le;�&amp;le;100000&lt;span aria-hidden=&quot;true&quot;&gt;$1&amp;nbsp;\leq N&amp;nbsp;\leq 100\,000$&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;1&amp;le;�&amp;le;10&lt;span aria-hidden=&quot;true&quot;&gt;$1&amp;nbsp;\leq M&amp;nbsp;\leq 10$&lt;/span&gt;)&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;둘째 줄부터&lt;span&gt;&amp;nbsp;&lt;/span&gt;�+1&lt;span aria-hidden=&quot;true&quot;&gt;$N+1$&lt;/span&gt;번째 줄까지 외울 단어를 입력받는다. 이때의 입력은 알파벳 소문자로만 주어지며 단어의 길이는&lt;span&gt;&amp;nbsp;&lt;/span&gt;10&lt;span aria-hidden=&quot;true&quot;&gt;$10$&lt;/span&gt;을 넘지 않는다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;단어장에&amp;nbsp;단어가 반드시 1개 이상 존재하는&amp;nbsp;입력만 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;화은이의 단어장에 들어 있는 단어를 단어장의 앞에 위치한 단어부터 한 줄에 한 단어씩 순서대로 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;7 4
apple
ant
sand
apple
append
sand
sand
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;dos&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;sand
apple
append
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-2&quot; class=&quot;armasm&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;12 5
appearance
append
attendance
swim
swift
swift
swift
mouse
wallet
mouse
ice
age
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-2&quot; class=&quot;armasm&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;swift
mouse
appearance
attendance
append
wallet&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내 답안&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&lt;/b&gt; &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;List에 문자열을 모두 입력받은 후 Set에 저장해 중복을 제거하고 Set을 Iterator 반복문을 돌려 각 문자열이 원본 List에 몇개씩 있는지 계산&lt;/span&gt; (시간초과)&lt;/p&gt;
&lt;pre id=&quot;code_1710795576824&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//시간초과 부분
for (int i = 0; i &amp;lt; n; i++) {
			String word = br.readLine();
			if (word.length() &amp;gt;= m) {
				list.add(word);
				hs.add(word);
			}
		}
		Iterator iter = hs.iterator();
		while (iter.hasNext()) {
			String temp = String.valueOf(iter.next());
			hm.put(temp, Collections.frequency(list, temp));
		}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&lt;/b&gt; getOrDefault(Object key, V DefaultValue) 사용&lt;/p&gt;
&lt;pre id=&quot;code_1710793562303&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer token = new StringTokenizer(br.readLine());
		HashMap&amp;lt;String, Integer&amp;gt; hm = new HashMap&amp;lt;&amp;gt;();
		int n = Integer.parseInt(token.nextToken());
		int m = Integer.parseInt(token.nextToken());
		for (int i = 0; i &amp;lt; n; i++) {
			String word = br.readLine();
			if (word.length() &amp;gt;= m) {
				//getOrDefault(Object key, V DefaultValue) :map에 key가 있으면 value리턴, 없으면 defalutValue리턴 - 
				Integer count = hm.getOrDefault(word, 0);
				hm.put(word, count + 1);
			}
		}

		List&amp;lt;String&amp;gt; keyList = new ArrayList&amp;lt;&amp;gt;(hm.keySet());
		keyList.sort(new Comparator&amp;lt;String&amp;gt;() {
			@Override
			public int compare(String o1, String o2) {
				// 빈도수가 다르면 빈도수 기준으로 역순 정렬
				if (hm.get(o1) != hm.get(o2)) {
					return Integer.compare(hm.get(o2), hm.get(o1));
					// return hm.get(o2) - (hm.get(o1));
				}
				// 빈도수는 같고 문자열 길이는 다르면 길이를 기준으로 역순 정렬
				if (o1.length() != o2.length()) {
					return Integer.compare(o2.length(), o1.length());
					// return o2.length() - o1.length();
				}
				// 빈도수와 문자열 길이가 모두 같다면 문자열 기준으로 사전순(알페벳순) 정렬
				return o1.compareTo(o2);
			}
		});
		for (String key : keyList) {
			bw.write(key + &quot;\n&quot;);
		}
		bw.flush();
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/113</guid>
      <comments>https://a-develop.tistory.com/113#entry113comment</comments>
      <pubDate>Tue, 19 Mar 2024 06:57:10 +0900</pubDate>
    </item>
    <item>
      <title>백준 1010 다리놓기 [JAVA]</title>
      <link>https://a-develop.tistory.com/112</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리뷰&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실패&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동쪽 개수에서 서쪽 개수를 택하는 조합 nCr을 사용했다. 해당 수식의 팩토리얼 계산 시 long타입 범위 초과로 0이 출력되는 문제가 생겼다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위해 무한대 정수를 계산할 수 있는 BigInteger클래스를 사용하였다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공부한 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BigInteger클래스 사용법&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1710157167858&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BigInteger result = new BigInteger(&quot;0&quot;); //선언
result.multiply(number); //곱셈
result.divide(number); //나눗셈
result.add(number); //덧셈
result.substract(number); //뺄셈
result.remainder(number); //나머지
BigInteger.valueOf(j)  // 형변환&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;재원이는 한 도시의 시장이 되었다. 이 도시에는&amp;nbsp;도시를 동쪽과 서쪽으로 나누는 큰 일직선 모양의 강이 흐르고 있다.&amp;nbsp;하지만 재원이는 다리가 없어서 시민들이 강을 건너는데 큰 불편을 겪고 있음을 알고 다리를 짓기로 결심하였다. 강 주변에서 다리를 짓기에 적합한 곳을 사이트라고 한다. 재원이는 강 주변을 면밀히 조사해 본 결과 강의 서쪽에는 N개의 사이트가 있고 동쪽에는 M개의 사이트가 있다는 것을 알았다. (N &amp;le; M)&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;재원이는 서쪽의 사이트와 동쪽의 사이트를 다리로 연결하려고 한다. (이때 한 사이트에는 최대 한 개의 다리만 연결될 수 있다.) 재원이는 다리를 최대한 많이 지으려고 하기 때문에 서쪽의 사이트 개수만큼 (N개) 다리를 지으려고 한다. 다리끼리는 서로 겹쳐질 수 없다고 할 때 다리를 지을 수 있는 경우의 수를 구하는 프로그램을 작성하라.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKAJIw/btsFI4nEUVA/gds6rqbhgEY3EPjndJYDx1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKAJIw/btsFI4nEUVA/gds6rqbhgEY3EPjndJYDx1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKAJIw/btsFI4nEUVA/gds6rqbhgEY3EPjndJYDx1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKAJIw%2FbtsFI4nEUVA%2Fgds6rqbhgEY3EPjndJYDx1%2Fimg.jpg&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;329&quot; height=&quot;353&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 &amp;lt; N &amp;le; M &amp;lt; 30)이 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;각 테스트 케이스에 대해 주어진 조건하에 다리를 지을 수 있는 경우의 수를 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3
2 2
1 5
13 29
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;1
5
67863915&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내 답안&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&lt;/b&gt; long타입 사용 (실패)&lt;/p&gt;
&lt;pre id=&quot;code_1710159550086&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int n = Integer.parseInt(br.readLine());
		for (int i = 0; i &amp;lt; n; i++) {
			StringTokenizer token = new StringTokenizer(br.readLine());
			long result = 0;
			int west = Integer.parseInt(token.nextToken());
			int east = Integer.parseInt(token.nextToken());
			int a = 1;
			for (int j = 1; j &amp;lt;= east; j++) {
				a *= j;
			}
			int b = 1;
			for (int j = 1; j &amp;lt;= west; j++) {
				b *= j;
			}
			int c = 1;
			for (int j = 1; j &amp;lt;= east - west; j++) {
				c *= j;
			}
			result = a / (b * c);
			bw.write(result + &quot;\n&quot;);
		}
		bw.flush();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&lt;/b&gt; BigInteger 클래스 사용&lt;/p&gt;
&lt;pre id=&quot;code_1710159423135&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.math.BigInteger;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int n = Integer.parseInt(br.readLine());
		for (int i = 0; i &amp;lt; n; i++) {
			StringTokenizer token = new StringTokenizer(br.readLine());
			BigInteger result = new BigInteger(&quot;0&quot;);
			int west = Integer.parseInt(token.nextToken());
			int east = Integer.parseInt(token.nextToken());
			BigInteger a = new BigInteger(&quot;1&quot;);
			for (int j = 1; j &amp;lt;= east; j++) {
				a = a.multiply(BigInteger.valueOf(j));
			}
			BigInteger b = new BigInteger(&quot;1&quot;);
			for (int j = 1; j &amp;lt;= west; j++) {
				b = b.multiply(BigInteger.valueOf(j));
			}
			BigInteger c = new BigInteger(&quot;1&quot;);
			for (int j = 1; j &amp;lt;= east - west; j++) {
				c = c.multiply(BigInteger.valueOf(j));
			}
			result = a.divide((b.multiply(c)));
			bw.write(result + &quot;\n&quot;);
		}
		bw.flush();
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/112</guid>
      <comments>https://a-develop.tistory.com/112#entry112comment</comments>
      <pubDate>Mon, 11 Mar 2024 21:22:36 +0900</pubDate>
    </item>
    <item>
      <title>백준 11659 누적합 [JAVA]</title>
      <link>https://a-develop.tistory.com/111</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리뷰&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시간초과&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;List로 입력을 받고 반복문으로 각 값을 얻어서 누적합을 구했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;시간초과 문제를 해결하기 위해, List에 입력받을 때 바로 각 수를 더한 뒤 누적합으로 입력받았다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다.&amp;nbsp;셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j가 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;총 M개의 줄에 입력으로 주어진 i번째 수부터 j번째 수까지 합을 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;제한&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_limit&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1 &amp;le; N &amp;le; 100,000&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1 &amp;le; M &amp;le; 100,000&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1 &amp;le; i &amp;le; j &amp;le; N&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;5 3
5 4 3 2 1
1 3
2 4
5 5
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;12
9
1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내 답안&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&lt;/b&gt; &lt;span style=&quot;color: #333333; letter-spacing: 0px;&quot;&gt;List로 입력 받고 반복문으로 누적합 구하기 (시간초과)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707444899531&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
		StringTokenizer token = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(token.nextToken());
		int m = Integer.parseInt(token.nextToken());
		token = new StringTokenizer(br.readLine());
		for (int i = 0; i &amp;lt; n; i++) {
			list.add(Integer.parseInt(token.nextToken()));
		}
		for (int i = 0; i &amp;lt; m; i++) {
			token = new StringTokenizer(br.readLine());
			int result = 0;
			int start = Integer.parseInt(token.nextToken());
			int end = Integer.parseInt(token.nextToken());
			for (int j = start; j &amp;lt;= end; j++) {
				result += list.get(j - 1);
			}
			bw.write(result + &quot;\n&quot;);
		}
		bw.flush();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&lt;/b&gt; List에 바로 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;누적합을 입력받기&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707452917233&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
		StringTokenizer token = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(token.nextToken());
		int m = Integer.parseInt(token.nextToken());
		token = new StringTokenizer(br.readLine());
		for (int i = 0; i &amp;lt; n; i++) {
			if (list.isEmpty()) {
				list.add(Integer.parseInt(token.nextToken()));
			} else {
				list.add(list.get(i - 1) + Integer.parseInt(token.nextToken()));
			}
		}
		for (int i = 0; i &amp;lt; m; i++) {
			token = new StringTokenizer(br.readLine());
			int result = 0;
			int start = Integer.parseInt(token.nextToken());
			int end = Integer.parseInt(token.nextToken());
			if (start != 1) {
				result = list.get(end - 1) - list.get(start - 2);
			} else {
				result = list.get(end - 1);
			}
			bw.write(result + &quot;\n&quot;);
		}
		bw.flush();
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/111</guid>
      <comments>https://a-develop.tistory.com/111#entry111comment</comments>
      <pubDate>Fri, 9 Feb 2024 13:36:39 +0900</pubDate>
    </item>
    <item>
      <title>백준 2485 가로수 [JAVA]</title>
      <link>https://a-develop.tistory.com/110</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리뷰&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시간초과&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;모든 수를 각각 비교해 최대공약수(간격)를 계산한 뒤, 모든 가로수 값을 HashSet에 저장해 중복을 확인했다.&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;시간초과 문제를 해결하기 위해 유클리드 호제법으로 최대공약수를 구하고, 추가한 가로수는 HashSet에 저장하지 않고 count++ 연산으로 체크했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;두 부분 다 수정해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;HashSet을 삭제해도 모든 수를 반복문 돌려서 최대공약수를 구하면 시간초과가 뜨고, 유클리드호제법을 사용해 최대공약수를 구하더라도 HashSet으로 개수를 카운트하면 메모리 초과가 뜬다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공부한 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러수의 최대공약수 - 유클리드호제법&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1707330494469&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;먼저 두 수를 골라 최대공약수를 구한다.
그 값(최대공약수)과 남은 수 중 하나의 최대공약수를 구한다. 
위 과정을 반복한다.&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;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1707331564751&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//큰수 max, 작은수 min

int temp = 0;
while (min != 0) {
		temp = max % min;
		max = min;
		min = temp;
	}
	result = max;
   }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;직선으로 되어있는 도로의 한 편에 가로수가 임의의 간격으로 심어져있다. KOI 시에서는 가로수들이 모두 같은 간격이 되도록 가로수를 추가로 심는 사업을 추진하고 있다. KOI 시에서는 예산문제로 가능한 한 가장 적은 수의 나무를 심고 싶다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;편의상 가로수의 위치는 기준점으로 부터 떨어져 있는 거리로 표현되며, 가로수의 위치는 모두 양의 정수이다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 가로수가 (1, 3, 7, 13)의 위치에 있다면 (5, 9, 11)의 위치에 가로수를 더 심으면 모든 가로수들의 간격이 같게 된다. 또한, 가로수가 (2, 6, 12, 18)에 있다면 (4, 8, 10, 14, 16)에 가로수를 더 심어야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;심어져 있는 가로수의 위치가 주어질 때, 모든 가로수가 같은 간격이 되도록 새로 심어야 하는 가로수의 최소수를 구하는 프로그램을 작성하라. 단, 추가되는 나무는 기존의 나무들 사이에만 심을 수 있다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에는 이미 심어져 있는 가로수의 수를 나타내는 하나의 정수 N이 주어진다(3 &amp;le; N &amp;le; 100,000). 둘째 줄부터 N개의 줄에는 각 줄마다 심어져 있는 가로수의 위치가 양의 정수로 주어지며, 가로수의 위치를 나타내는 정수는 1,000,000,000 이하이다. 가로수의 위치를 나타내는 정수는 모두 다르고, N개의 가로수는 기준점으로부터 떨어진 거리가 가까운 순서대로 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;모든 가로수가 같은 간격이 되도록 새로 심어야 하는 가로수의 최소수를 첫 번째 줄에 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;4
1
3
7
13
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-2&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;4
2
6
12
18
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-2&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;5&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내 답안&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&lt;/b&gt; &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;모든 수를 각각 비교해 최대공약수(간격)를&lt;/span&gt; 구한 뒤, 모든 가로수 값을 HashSet에 저장해 중복 확인 (시간초과)&lt;/p&gt;
&lt;pre id=&quot;code_1707325055874&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		HashSet&amp;lt;Integer&amp;gt; hs = new HashSet&amp;lt;&amp;gt;();
		ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
		ArrayList&amp;lt;Integer&amp;gt; listMinus = new ArrayList&amp;lt;&amp;gt;();
		ArrayList&amp;lt;Integer&amp;gt; listGCD = new ArrayList&amp;lt;&amp;gt;();
		int n = Integer.parseInt(br.readLine());
		for (int i = 0; i &amp;lt; n; i++) {
			int k = Integer.parseInt(br.readLine());
			list.add(k);
			hs.add(k);
		}
		for (int i = 1; i &amp;lt; n; i++) {
			listMinus.add(list.get(i) - list.get(i-1));
		}
		for (int i = 0; i &amp;lt; listMinus.size(); i++) {
			int gcd = 0;
			for (int j = i + 1; j &amp;lt; listMinus.size(); j++) {
				int min = Math.min(listMinus.get(i), listMinus.get(j));
				for (int h = 1; h &amp;lt; min; h++) {
					if (listMinus.get(i) % h == 0 &amp;amp;&amp;amp; listMinus.get(j) % h == 0) {
						gcd = j;
					}
				}
			}
			if (gcd &amp;gt; 0) {
				listGCD.add(gcd);
			}
		}
		Collections.sort(listGCD);
		int interval = listGCD.get(0);
		int k = list.get(0);
		int count = 0;
		while (k &amp;lt; list.get(list.size() - 1)) {
			k += interval;
			if (k &amp;lt; list.get(list.size() - 1)) {
				if (hs.add(k)) {
					count++;
				}
			}
		}
		bw.write(count + &quot;\n&quot;);
		bw.flush();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&lt;/b&gt; &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;유클리드 호제법,&lt;/span&gt; &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;HashSet대신 count++ 사용&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707328759081&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
		ArrayList&amp;lt;Integer&amp;gt; listInterval = new ArrayList&amp;lt;&amp;gt;();
		int n = Integer.parseInt(br.readLine());
		for (int i = 0; i &amp;lt; n; i++) {
			int k = Integer.parseInt(br.readLine());
			list.add(k);
		}
		for (int i = 1; i &amp;lt; n; i++) {
			listInterval.add(list.get(i) - list.get(i - 1));
		}
		int min = listInterval.get(0);
		for (int i = 1; i &amp;lt; listInterval.size(); i++) {
			int x = 0;
			int max = listInterval.get(i);
			while (min != 0) {
				x = max % min;
				max = min;
				min = x;
			}
			min = max;
		}
		int interval = min;
		int k = list.get(0);
		int count = 1;
		while (k &amp;lt; list.get(list.size() - 1)) {
			k += interval;
			if (k &amp;lt;= list.get(list.size() - 1)) {
				count++;
			}
		}
		int result = count - list.size();
		bw.write(result + &quot;\n&quot;);
		bw.flush();
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/110</guid>
      <comments>https://a-develop.tistory.com/110#entry110comment</comments>
      <pubDate>Thu, 8 Feb 2024 03:21:23 +0900</pubDate>
    </item>
    <item>
      <title>백준 11650 좌표 정렬하기 [JAVA]</title>
      <link>https://a-develop.tistory.com/109</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리뷰&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시간초과&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2차원 배열로 값을 입력받은 후, 반복문을 돌려서 모든 값을 하나씩 비교했다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공부한 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1차원 배열 정렬 시 사용하는 Arrays.sort(arr)의 인자로 Comparator인터페이스의 Compare메소드를 오버라이딩해 추가하면 2차원 배열도 정렬할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1707153140571&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Arrays.sort(arr, new Comparator&amp;lt;int[]&amp;gt;() { //한번만 사용되기때문에 익명클래스(익명구현객체) 사용
	public int compare(int[] arr1, int[] arr2) { //2차원 배열을 2개씩 비교
		if (arr1[0] != arr2[0]) { // 두 2차원 배열의 x값 비교
			return arr1[0] - arr2[0]; // 오름차순 정렬(양수면 순서바꿈, 음수면 그대로둠). 앞 뒤 바꾸면 내림차순 정렬.
		} else {
			return arr1[1] - arr2[1]; //두 2차원배월의 y값 비교
		}
	}
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;익명클래스 사용법&quot; href=&quot;https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9D%B5%EB%AA%85-%ED%81%B4%EB%9E%98%EC%8A%A4Anonymous-Class-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;익명클래스 사용법&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 점의 개수 N (1 &amp;le; N &amp;le; 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 &amp;le; xi, yi&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;le; 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄부터 N개의 줄에 점을 정렬한&amp;nbsp;결과를 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;5
3 4
1 1
1 -1
2 2
3 3
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;1 -1
1 1
2 2
3 3
3 4&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내 답안&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&amp;nbsp;&lt;/b&gt;모든 값 하나씩 비교(시간초과)&lt;/p&gt;
&lt;pre id=&quot;code_1707151154691&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int n = Integer.parseInt(br.readLine());
		int arr[][];
		arr = new int[n][2];
		for (int i = 0; i &amp;lt; n; i++) {
			StringTokenizer token = new StringTokenizer(br.readLine());
			arr[i][0] = Integer.parseInt(token.nextToken());
			arr[i][1] = Integer.parseInt(token.nextToken());
		}
		for (int i = 0; i &amp;lt; n - 1; i++) {
			for (int j = i + 1; j &amp;lt; n; j++) {
				if (arr[i][0] &amp;gt; arr[j][0]) {
					int temp1 = arr[i][0];
					int temp2 = arr[i][1];
					arr[i][0] = arr[j][0];
					arr[i][1] = arr[j][1];
					arr[j][0] = temp1;
					arr[j][1] = temp2;
				} else if (arr[i][0] == arr[j][0]) {
					if (arr[i][1] &amp;gt; arr[j][1]) {
						int temp2 = arr[i][1];
						arr[i][1] = arr[j][1];
						arr[j][1] = temp2;
					}
				}
			}
		}
		for (int i = 0; i &amp;lt; n; i++) {
			bw.write(arr[i][0] + &quot; &quot; + arr[i][1] + &quot;\n&quot;);
		}
		bw.flush();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&lt;/b&gt; Comparator 인터페이스의 Compare메소드 오버라이딩&lt;/p&gt;
&lt;pre id=&quot;code_1707152996714&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int n = Integer.parseInt(br.readLine());
		int arr[][];
		arr = new int[n][2];
		for (int i = 0; i &amp;lt; n; i++) {
			StringTokenizer token = new StringTokenizer(br.readLine());
			arr[i][0] = Integer.parseInt(token.nextToken());
			arr[i][1] = Integer.parseInt(token.nextToken());
		}
		Arrays.sort(arr, new Comparator&amp;lt;int[]&amp;gt;() {
			public int compare(int[] arr1, int[] arr2) {
				if (arr1[0] != arr2[0]) {
					return arr1[0] - arr2[0];
				} else {
					return arr1[1] - arr2[1];
				}
			}
		});
		for (int i = 0; i &amp;lt; n; i++) {
			bw.write(arr[i][0] + &quot; &quot; + arr[i][1] + &quot;\n&quot;);
		}
		bw.flush();
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/109</guid>
      <comments>https://a-develop.tistory.com/109#entry109comment</comments>
      <pubDate>Tue, 6 Feb 2024 02:12:39 +0900</pubDate>
    </item>
    <item>
      <title>백준 1620 나는야 포켓몬 마스터 이다솜 [JAVA]</title>
      <link>https://a-develop.tistory.com/108</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리뷰&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시간초과&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HashMap 사용. key값이 입력되면 map.get(key)로 value값을 얻고, value값이 입력되면 map.setKey()를 반복문으로 돌리면서 map.get(key)와 value값을 대조해 올바른 key값을 얻었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map.setKey() 반복문을 최대 100000번 돌리는 과정에서 시간초과가 발생한 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 문제 해결을 위해, HashMap과 ArrayList 두개를 사용해서 값을 저장한 뒤, 문자가 입력될 경우에는 map.get(key)를 사용해 값을 얻고, 숫자가 입력될 경우에는 setKey()반복문 대신 list.get(int)를 사용해서 즉시 값을 얻도록 했다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공부한 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;HashMap key값으로 value값 찾기&lt;/span&gt;&lt;/span&gt;
&lt;pre class=&quot;maxima&quot; style=&quot;background-color: #f5f5f5; color: #333333; text-align: left;&quot;&gt;&lt;code&gt;map.get(key값)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;HashMap value값으로 key값 찾기&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #f5f5f5; color: #333333; text-align: left;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;if (map.containsValue(aString)) {
            for (int key : map.keySet()) {
                if (map.get(key).equals(aString)) {
                    bw.write(key + &quot;\n&quot;);
                }
            }
//추가로 value값이 숫자인 경우 ArrayList나 배열 등 Index가 있는 자료구조 활용 가능&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면 물어봐도 괜찮아. 나는 언제든지 질문에 답해줄 준비가 되어있어.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;둘째 줄부터 N개의 줄에 포켓몬의 번호가 1번인 포켓몬부터 N번에 해당하는 포켓몬까지 한 줄에 하나씩 입력으로 들어와. 포켓몬의 이름은 모두 영어로만 이루어져있고, 또, 음... 첫 글자만 대문자이고, 나머지 문자는 소문자로만 이루어져 있어. 아참! 일부 포켓몬은 마지막 문자만 대문자일 수도 있어. 포켓몬 이름의 최대 길이는 20, 최소 길이는 2야. 그 다음 줄부터 총 M개의 줄에 내가 맞춰야하는 문제가 입력으로 들어와. 문제가 알파벳으로만 들어오면 포켓몬 번호를 말해야 하고, 숫자로만 들어오면, 포켓몬 번호에 해당하는 문자를 출력해야해. 입력으로 들어오는 숫자는 반드시 1보다 크거나 같고, N보다 작거나 같고, 입력으로 들어오는 문자는 반드시 도감에 있는 포켓몬의 이름만 주어져. 그럼 화이팅!!!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄부터 차례대로 M개의 줄에 각각의 문제에 대한 답을 말해줬으면 좋겠어!!!. 입력으로 숫자가 들어왔다면 그 숫자에 해당하는 포켓몬의 이름을, 문자가 들어왔으면 그 포켓몬의 이름에 해당하는 번호를 출력하면 돼.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;26 5
Bulbasaur
Ivysaur
Venusaur
Charmander
Charmeleon
Charizard
Squirtle
Wartortle
Blastoise
Caterpie
Metapod
Butterfree
Weedle
Kakuna
Beedrill
Pidgey
Pidgeotto
Pidgeot
Rattata
Raticate
Spearow
Fearow
Ekans
Arbok
Pikachu
Raichu
25
Raichu
3
Pidgey
Kakuna&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;Pikachu
26
Venusaur
16
14&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내 답안&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 시간초과 - &lt;/b&gt;HashMap + map.setKey() 반복문&lt;/p&gt;
&lt;pre id=&quot;code_1706426980519&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer token = new StringTokenizer(br.readLine());
		Map&amp;lt;Integer, String&amp;gt; map = new HashMap&amp;lt;&amp;gt;();
		int num1 = Integer.parseInt(token.nextToken());
		int num2 = Integer.parseInt(token.nextToken());
		for (int i = 1; i &amp;lt;= num1; i++) {
			map.put(i, br.readLine());
		}
		for (int i = 0; i &amp;lt; num2; i++) {
			String aString = br.readLine();
			if (map.containsValue(aString)) {
				for (int key : map.keySet()) {
					if (map.get(key).equals(aString)) {
						bw.write(key + &quot;\n&quot;);
						break;
					}
				}
			}
			else{
				bw.write(map.get(Integer.parseInt(aString)) + &quot;\n&quot;);
			}
		}
		bw.flush();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&lt;/b&gt; HashMap + ArrayList&lt;/p&gt;
&lt;pre id=&quot;code_1706434207754&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer token = new StringTokenizer(br.readLine());
		Map&amp;lt;String, Integer&amp;gt; map = new HashMap&amp;lt;&amp;gt;();
		List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
		int num1 = Integer.parseInt(token.nextToken());
		int num2 = Integer.parseInt(token.nextToken());
		for (int i = 1; i &amp;lt;= num1; i++) {
			String a = br.readLine();
			map.put(a, i);
			list.add(a);
		}
		for (int i = 0; i &amp;lt; num2; i++) {
			String aString = br.readLine();
			if (map.containsKey(aString)) {
				bw.write(map.get(aString) + &quot;\n&quot;);
			} else {
				int aInt = Integer.parseInt(aString);
				bw.write(list.get(aInt - 1) + &quot;\n&quot;);
			}
		}
		bw.flush();
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/108</guid>
      <comments>https://a-develop.tistory.com/108#entry108comment</comments>
      <pubDate>Sun, 28 Jan 2024 18:42:48 +0900</pubDate>
    </item>
    <item>
      <title>백준 10815 숫자 카드 [JAVA]</title>
      <link>https://a-develop.tistory.com/107</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리뷰&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시간초과&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A의 카드를 List에 넣고 B의 카드가 입력될 때마다 List를 for문으로 돌려서 동일한 값이 있는지 비교했다.&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 읽어보니 입력조건이 n&amp;lt;500000 이라서, 카드 한장당 50만번씩 일일이 비교하는 건 비효율적이다. &amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공부한 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;무작정 노가다성(?) 코드를 작성하지 말고 좋은 알고리즘을 고민하자.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다.&amp;nbsp;정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 가지고 있는지 아닌지를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 &amp;le; N &amp;le; 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는&amp;nbsp;-10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자&amp;nbsp;카드에 같은 수가 적혀있는 경우는 없다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;셋째 줄에는 M(1 &amp;le; M &amp;le; 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도&amp;nbsp;-10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각&amp;nbsp;수가 적힌 숫자 카드를&amp;nbsp;상근이가 가지고 있으면 1을, 아니면 0을 공백으로 구분해 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;5
6 3 2 10 -10
8
10 9 -5 2 3 4 5 -10
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;1 0 0 1 1 0 0 1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내 답안&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. &lt;/b&gt;각 숫자마다 List for문 비교 (시간 초과)&lt;/p&gt;
&lt;pre id=&quot;code_1704776563838&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashSet;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int n = Integer.parseInt(br.readLine());
		HashSet&amp;lt;Integer&amp;gt; set = new HashSet&amp;lt;&amp;gt;();
		StringTokenizer token = new StringTokenizer(br.readLine());
		for (int i = 0; i &amp;lt; n; i++) {
			set.add(Integer.parseInt(token.nextToken()));
		}
		int m = Integer.parseInt(br.readLine());
		token = new StringTokenizer(br.readLine());
		for (int i = 0; i &amp;lt; m; i++) {
			int t = Integer.parseInt(token.nextToken());
			if (set.add(t) == false) {
				bw.write(1 + &quot; &quot;);
			} else {
				bw.write(0 + &quot; &quot;);
				set.remove(t);
			}
			bw.flush();
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. HashSet 사용&lt;/p&gt;
&lt;pre id=&quot;code_1704778156493&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashSet;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int n = Integer.parseInt(br.readLine());
		HashSet&amp;lt;Integer&amp;gt; set = new HashSet&amp;lt;&amp;gt;();
		StringTokenizer token = new StringTokenizer(br.readLine());
		for (int i = 0; i &amp;lt; n; i++) {
			set.add(Integer.parseInt(token.nextToken()));
		}
		int m = Integer.parseInt(br.readLine());
		token = new StringTokenizer(br.readLine());
		for (int i = 0; i &amp;lt; m; i++) {
			int t = Integer.parseInt(token.nextToken());
			if (set.add(t) == false) {
				bw.write(1 + &quot; &quot;);
			} else {
				bw.write(0 + &quot; &quot;);
				set.remove(t);
			}
			bw.flush();
		}
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/107</guid>
      <comments>https://a-develop.tistory.com/107#entry107comment</comments>
      <pubDate>Tue, 9 Jan 2024 14:31:55 +0900</pubDate>
    </item>
    <item>
      <title>백준 2745 진법 변환 [JAVA]</title>
      <link>https://a-develop.tistory.com/106</link>
      <description>&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리뷰&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성공&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;char타입 계산 실수가 여러번 있었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&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;제곱 메소드 : Math.pow(double A, double B) = A의 B승&lt;/li&gt;
&lt;li&gt;char타입 값이 숫자인지 확인하는 메소드 : boolean Character.isDigit(char C)&lt;/li&gt;
&lt;li&gt;char타입 연산 방법 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;//주요 아스키코드

문자       &amp;lt;-&amp;gt; ASCII CODE
0          &amp;lt;-&amp;gt; 48
A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;lt;-&amp;gt; 65
a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;lt;-&amp;gt; 97&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;//char타입 비교 시 따옴표 붙이기

n.charAt(i) == 1 //(x)
n.charAt(i) == '1' //(o)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;//char타입 숫자를 int로 변환하려고 할 때, (int)를 붙이면 아스키코드 값이 반환된다. 
//char타입 숫자 - '0' 을 하면 유니코드로값으로 연산 후 10진수와 동일한 값을 반환한다.

arrn[i] = (int)n.charAt(i); //(x)
arrn[i] = n.charAt(i) - '0'; //(o)
arrn[i] = n.charAt(i) - 48; //(o)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;B진법 수&amp;nbsp;N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를&amp;nbsp;사용한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 N과 B가 주어진다. (2 &amp;le; B &amp;le; 36)&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 B진법 수&amp;nbsp;N을 10진법으로 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;ZZZZZ 36
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;60466175&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내 답안&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer token = new StringTokenizer(br.readLine());
		String n = token.nextToken();
		int b = Integer.parseInt(token.nextToken());
		int result = 0;
		int arrresult[] = new int[n.length()];
		ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
		int arrn[] = new int[n.length()];
		for (int i = n.length() - 1; i &amp;gt;= 0; i--) {
			list.add((int) Math.pow(b, i));
		}
		for (int i = 0; i &amp;lt; n.length(); i++) {
			if (n.charAt(i) == '0' || n.charAt(i) == '1' || n.charAt(i) == '2' || n.charAt(i) == '3'
					|| n.charAt(i) == '4' || n.charAt(i) == '5' || n.charAt(i) == '6' | n.charAt(i) == '7'
					|| n.charAt(i) == '8' || n.charAt(i) == '9') {
				arrn[i] = n.charAt(i) - '0';
			} else {
				arrn[i] = n.charAt(i) - '7';
			}
		}
		for (int i = 0; i &amp;lt; n.length(); i++) {
			arrresult[i] = arrn[i] * list.get(i);
		}
		for (int k : arrresult) {
			result += k;
		}
		bw.write(result + &quot;\n&quot;);
		bw.flush();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; 리팩토링 - Character.isDigit() 사용, 차수를 1씩 감소시키는 for문 제거 후 단일 증감문으로 대체.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer token = new StringTokenizer(br.readLine());
		String n = token.nextToken();
		int b = Integer.parseInt(token.nextToken());
		int result = 0;
		int arrn[] = new int[n.length()];
		int degree = n.length() - 1;
		for (int i = 0; i &amp;lt; n.length(); i++) {
			if (Character.isDigit(n.charAt(i))) {
				arrn[i] = n.charAt(i) - '0';
			} else {
				arrn[i] = n.charAt(i) - '7';
			}
			result += arrn[i] * (int) Math.pow(b, degree--);
		}
		bw.write(result + &quot;\n&quot;);
		bw.flush();
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/106</guid>
      <comments>https://a-develop.tistory.com/106#entry106comment</comments>
      <pubDate>Thu, 4 Jan 2024 15:54:51 +0900</pubDate>
    </item>
    <item>
      <title>백준 1934 최소공배수 - 3가지 방법 [JAVA]</title>
      <link>https://a-develop.tistory.com/105</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리뷰&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;메모리 초과&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;for문 사용, 1씩 증가시키면서 곱한 뒤 HashSet에 넣는 작업을 반복했고 도중에 add()메소드가 false를 리턴하면 그 값을 최소공배수로 출력하였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력되는 수가 크면 클수록 앞에서부터 하나씩 비교하는 건 비효율적이어서 메모리 초과가 뜬 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위의 메모리 초과 문제를 해결하기 위해 둘 중 큰 수만 for문 사용, 1씩 증가시키면서 곱한 뒤 작은 수로 나눴을 때 나머지가 0이 되는 값을 최소공배수로 출력하였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공부한 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추가적으로 최소공배수를 구하는 방법으로는 유클리드 호제법이 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최소공배수 = 두 수의 곱/최대공약수&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있으며, 최소 공배수는 30이다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;두 자연수 A와 B가 주어졌을 때, A와 B의 최소공배수를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 테스트 케이스의 개수 T(1 &amp;le; T &amp;le; 1,000)가 주어진다. 둘째 줄부터 T개의 줄에 걸쳐서 A와 B가 주어진다. (1 &amp;le; A, B &amp;le; 45,000)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄부터 T개의 줄에 A와 B의&amp;nbsp;최소공배수를 입력받은 순서대로 한 줄에 하나씩 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3
1 45000
6 10
13 17
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;45000
30
221&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내 답안&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. &lt;/b&gt;두 수 for문, HashSet 사용 (메모리 초과)&lt;/p&gt;
&lt;pre id=&quot;code_1704171025650&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashSet;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int num = Integer.parseInt(br.readLine());
		for (int i = 0; i &amp;lt; num; i++) {
			HashSet&amp;lt;Integer&amp;gt; hs = new HashSet&amp;lt;&amp;gt;();
			StringTokenizer token = new StringTokenizer(br.readLine());
			int max = Integer.parseInt(token.nextToken());
			int min = Integer.parseInt(token.nextToken());
			if (max &amp;lt; min) {
				int temp = min;
				min = max;
				max = temp;
			}
			for (int j = 0; ; j++) {
				hs.add(max * (j + 1));
				if (min * (j + 1) &amp;gt;= max) {
					if (hs.add(min * (j + 1)) == false) {
						bw.write(min*(j + 1) + &quot;\n&quot;);
						bw.flush();
						break;
					} else {
						hs.add(min * (j + 1));
					}
				}
			}
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&lt;/b&gt; 큰 수만 for문, 작은 수로 나누기&lt;/p&gt;
&lt;pre id=&quot;code_1704171423240&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int num = Integer.parseInt(br.readLine());
		for (int i = 0; i &amp;lt; num; i++) {
			StringTokenizer token = new StringTokenizer(br.readLine());
			int max = Integer.parseInt(token.nextToken());
			int min = Integer.parseInt(token.nextToken());
			if (max &amp;lt; min) {
				int temp = min;
				min = max;
				max = temp;
			}
			for (int j = 0;; j++) {
				if (max * (j + 1) % min == 0) {
					bw.write(max * (j + 1) + &quot;\n&quot;);
					bw.flush();
					break;
				}
			}
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.&lt;/b&gt; 유클리드 호제법&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704173637151&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int num = Integer.parseInt(br.readLine());
		for (int i = 0; i &amp;lt; num; i++) {
			ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
			StringTokenizer token = new StringTokenizer(br.readLine());
			int max = Integer.parseInt(token.nextToken());
			int min = Integer.parseInt(token.nextToken());
			if (max &amp;lt; min) {
				int temp = min;
				min = max;
				max = temp;
			}
			for (int j = 0;j&amp;lt;min; j++) {
				if (min%(j+1) == 0&amp;amp;&amp;amp;max%(j+1)==0) {
					list.add(j+1);
				}
			}
			bw.write(max*min/list.get(list.size()-1) + &quot;\n&quot;);
			bw.flush();
		}
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/105</guid>
      <comments>https://a-develop.tistory.com/105#entry105comment</comments>
      <pubDate>Tue, 2 Jan 2024 14:37:06 +0900</pubDate>
    </item>
    <item>
      <title>백준 10809 알파벳 찾기 [JAVA]</title>
      <link>https://a-develop.tistory.com/102</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리뷰 &lt;/b&gt;&lt;/h3&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;배열 공간 낭비가 있었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;char타입 a(97)~z(122)를 배열에 넣으려고&amp;nbsp; char[123]을 생성했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;a~z는 &quot;각 알파벳- a&quot;를 하면 &quot;0,1,2...N&quot;이 나오기때문에 배열에 순서대로 넣을 수 있다.&lt;/li&gt;
&lt;li&gt;char타입 배열 값 존재 확인 시 &quot;!=null&quot;이 아니라, &quot;!=0&quot;으로 비교한다 ( 10진수 0이 char타입 NUL).&lt;/li&gt;
&lt;li&gt;indexOf()는 문자(열)을 앞에서부터 순차적으로 찾으며 처음 발견된 인덱스를 반환하고, 찾지 못할 경우 -1을 반환한다. &amp;nbsp;lastIndexOf()는 뒤에서부터 찾는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.&lt;/p&gt;
&lt;div id=&quot;problem-body&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력&amp;nbsp;&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;armasm&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;baekjoon
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력&amp;nbsp;&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내 답안&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1702792707081&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		char arr[] = new char[123];
		for (char i = 'a'; i &amp;lt;= 'z'; i++) {
			for (int j = 0; j &amp;lt; s.length(); j++) {
				if (i == s.charAt(j)) {
					System.out.print(j + &quot; &quot;);
					arr[i] = 1;
					break;
				}
			}
			if (arr[i] == 0) {
				System.out.print(-1 + &quot; &quot;);
			}
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;다른 답안&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1702793162320&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;https://www.acmicpc.net/source/70391665

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String str = scanner.next();
    int[] abc = new int[26];
    int length = str.length();
    for (int i = 0; i &amp;lt; 26; i++) {
      abc[i] = -1;
    }
    for (int i = 0; i &amp;lt; length; i++) {
      if (abc[str.charAt(i) - 97] == -1) {
        abc[str.charAt(i) - 97] = i;
      }
    }
    for (int i = 0; i &amp;lt; 26; i++) {
      System.out.print(abc[i] + &quot; &quot;);
    }
    scanner.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702796712192&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;https://www.acmicpc.net/source/70394985

import java.util.Scanner;
public class Main {

	public static void main(String[] args)  {
		Scanner sc = new Scanner(System.in);
		String s = sc.nextLine();
		int [] arr = new int[26];
		for(int i=0;i&amp;lt;26;i++) {
			if(s.indexOf('a'+i)==-1) {
				arr[i]=-1;
			}
			else {
				arr[i]=s.indexOf('a'+i);
			}
		}
		for(int i=0;i&amp;lt;26;i++) {
			System.out.print(arr[i]+&quot; &quot;);
		}
	}

}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding test</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/102</guid>
      <comments>https://a-develop.tistory.com/102#entry102comment</comments>
      <pubDate>Sun, 17 Dec 2023 16:16:01 +0900</pubDate>
    </item>
    <item>
      <title>AWS EC2 FreeTier 사용법 2 (JDK, Tomcat설치 및 WAR파일 배포)</title>
      <link>https://a-develop.tistory.com/101</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&amp;lt;git bash&amp;gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;EC2 접속&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ssh -i [키페어경로] [AWS인스턴스연결 사용자아이디]@[퍼블릭IPv4주소] &lt;br /&gt;yes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&quot;[AWS인스턴스연결 사용자아이디]@ip ~&quot; 와 같이 접속자 뜨면 성공&lt;/p&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;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;JDK 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt-get update&lt;br /&gt;sudo apt-get install openjdk-11-jdk&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yes &lt;br /&gt;- 설치 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;java -version&lt;br /&gt;- 설치 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;javac -version&lt;/p&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;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;톰캣 wget설치 및 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 설치 폴더 생성 &lt;br /&gt;sudo&amp;nbsp;mkdir&amp;nbsp;/home/tomcat&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최신버전 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tomcat.apache.org/download-90.cgi&quot;&gt;https://tomcat.apache.org/download-90.cgi&lt;/a&gt; 에서 tar.gz 링크 복사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cd&amp;nbsp;/home/tomcat &lt;br /&gt;sudo&amp;nbsp;wget&amp;nbsp;&lt;a href=&quot;https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.73/bin/apache-tomcat-9.0.73.tar.gz&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.73/bin/apache-tomcat-9.0.73.tar.gz&lt;/a&gt; &lt;br /&gt;- 압축해제 &lt;br /&gt;sudo&amp;nbsp;tar&amp;nbsp;xvfz&amp;nbsp;apache-tomcat-9.0.73.tar.gz &lt;br /&gt;- 설치파일 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo rm apache-tomcat-9.0.73.tar.gz&lt;br /&gt;- 권한 부여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo chmod -R 777 /home/tomcat/apache-tomcat-9.0.73/bin &lt;br /&gt;- 톰캣 실행 &lt;br /&gt;cd /home/tomcat/apache-tomcat-9.0.73/bin &lt;br /&gt;sudo ./startup.sh &lt;br /&gt;&quot;Tomcat started&quot; 나오면 성공&amp;nbsp;&lt;br /&gt;- 설치 확인 &lt;br /&gt;sudo /home/tomcat/apache-tomcat-9.0.73/bin/version.sh&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 톰캣 종료&amp;nbsp;&lt;br /&gt;cd&amp;nbsp;/home/tomcat/apache-tomcat-9.0.73/bin &lt;br /&gt;sudo&amp;nbsp;./shutdown.sh&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;&lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://ldgeao99-developer.tistory.com/576&quot;&gt;https://ldgeao99-developer.tistory.com/576&lt;/a&gt;&amp;nbsp;참고&lt;/i&gt;&lt;/span&gt;&lt;/p&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;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;배포&lt;/b&gt; ★톰캣 종료 후 배포하기★&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 배포할 war파일 추출 &lt;br /&gt;Eclipse 해당 프로젝트 우클릭 - export - WAR file - export source 체크 &lt;br /&gt;- &amp;lt;filezilla&amp;gt;로 EC2 인스턴스 접속하기 &lt;br /&gt;AWS EC2에서 해당 인스턴스 연결 클릭 후 퍼블릭ip주소와 사용자 이름 확인.&lt;br /&gt;filezilla 다운 및 실행.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 사이트 연결 클릭, 프로토콜 SFTP - SSH File Transfer Protocol 선택, Logon Type Key file 선택, host에 퍼블릭ip주소 입력, &quot;.pem&quot;파일이 저장된 경로 선택&lt;br /&gt;- 톰캣 폴더 권한 부여하기 &lt;br /&gt;sudo&amp;nbsp;chmod&amp;nbsp;-R&amp;nbsp;777&amp;nbsp;/home/tomcat/apache-tomcat-9.0.73/webapps&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 디렉토리에 권한 부여(모두(소유자, 그룹, other)에게 해당 폴더 모든 작업 권한 부여)&lt;br /&gt;- WAR 파일 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;filezilla remote site 영역에서 /home/tomcat/apache-tomcat-9.0.73/webapps 아래에 war파일 드래그해서 넣기.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 톰캣 폴더 권한 부여하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo chmod -R 777 /home/tomcat/apache-tomcat-9.0.73/webapps&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 톰캣 실행&lt;br /&gt;cd&amp;nbsp;/home/tomcat/apache-tomcat-9.0.73/bin &lt;br /&gt;sudo&amp;nbsp;./startup.sh &lt;br /&gt;- 연결 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소창에 퍼블릭ip주소:8080 입력 후 톰캣 기본화면 뜨는지 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;톰캣 9.0.73.png&quot; data-origin-width=&quot;1561&quot; data-origin-height=&quot;846&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEJuTF/btr2NjjKYLM/hjpDmM7wpa3xH76XBB4KS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEJuTF/btr2NjjKYLM/hjpDmM7wpa3xH76XBB4KS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEJuTF/btr2NjjKYLM/hjpDmM7wpa3xH76XBB4KS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEJuTF%2Fbtr2NjjKYLM%2FhjpDmM7wpa3xH76XBB4KS1%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;1561&quot; height=&quot;846&quot; data-filename=&quot;톰캣 9.0.73.png&quot; data-origin-width=&quot;1561&quot; data-origin-height=&quot;846&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;본인&amp;nbsp;프로젝트&amp;nbsp;접속&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소창에 퍼블릭ip주소:8080/war파일명&lt;/p&gt;</description>
      <category>Web dev/Basic</category>
      <category>AWS</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/101</guid>
      <comments>https://a-develop.tistory.com/101#entry101comment</comments>
      <pubDate>Fri, 10 Mar 2023 00:01:50 +0900</pubDate>
    </item>
    <item>
      <title>AWS EC2 FreeTier 사용법 1 (AWS 설정)</title>
      <link>https://a-develop.tistory.com/100</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;구축할 EC2/RDS 환경&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ubuntu 22.04.1 LTS(GNU/Linux 5.15.0-1031-aws x86_64) &lt;br /&gt;openjdk 11.0.18 &lt;br /&gt;Tomcat 9.0.73&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL Community 8.0.31&lt;/p&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;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;가입&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 지원 무료 플랜 선택 후 가입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt;&amp;nbsp;AWS Management Console로 이동&amp;nbsp; &lt;br /&gt;-&amp;gt;&amp;nbsp;루트 사용자로 로그인 &lt;br /&gt;-&amp;gt;&amp;nbsp;오른쪽 상단 리전 선택 (서울)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;EC2&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 시작&lt;br /&gt;-&amp;gt;&amp;nbsp;이름 및 태그 설정 &lt;br /&gt;-&amp;gt; 애플리케이션 및 OS 이미지 (AMI) 우분투 선택 &lt;br /&gt;-&amp;gt;&amp;nbsp;인스턴스 유형 t2.mocro 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;t2.micro.png&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J7wGm/btr2OurwkI1/bUkZ6CkmkNt4wkzFpLR6KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J7wGm/btr2OurwkI1/bUkZ6CkmkNt4wkzFpLR6KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J7wGm/btr2OurwkI1/bUkZ6CkmkNt4wkzFpLR6KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ7wGm%2Fbtr2OurwkI1%2FbUkZ6CkmkNt4wkzFpLR6KK%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;895&quot; height=&quot;298&quot; data-filename=&quot;t2.micro.png&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;gt;&amp;nbsp;스토리지 30gib&amp;nbsp; &lt;br /&gt;-&amp;gt;&amp;nbsp;네트워크 설정 ssh https http 트래픽 허용 모두 체크 or 편집 포트번호 직접 입력 &lt;br /&gt;-&amp;gt; 키페어 생성 &lt;br /&gt;-&amp;gt; 고급 세부 정보 새 IAM 프로파일 생성&amp;nbsp; &lt;br /&gt;- 사용자 그룹 - 그룹 생성 - 그룹명 클릭 후 권한추가 - 정책연결 - ec2full 체크 후 권한추가.&lt;br /&gt;- 사용자 - 사용자 추가 -&amp;nbsp; &lt;br /&gt;AWS Management Console에 대한 사용자 액세스 권한 제공 체크 - IAM 사용자를 생성하고 싶음 체크 - 사용자는 다음 로그인 시 새 암호를 생성해야 합니다 체크 해제 - 그룹에 사용자 추가 - 사용자 생성.&lt;br /&gt;- 역할 - 역할 만들기 - ec2 선택 - AmazonS3FullAccess 입력 및 선택 - 역할 생성.&lt;br /&gt;-&amp;gt;&amp;nbsp;IAM 인스턴스 프로파일 선택 &lt;br /&gt;-&amp;gt;&amp;nbsp;인스턴스 시작 &lt;br /&gt;-&amp;gt;&amp;nbsp;모든 인스턴스 보기(확인하기) &lt;br /&gt;-&amp;gt; 네트워크 및 보안 탄력적IP - 탄력적IP 주소 할당 - 할당 - 작업 - 탄력적 IP 주소 연결 - 연결.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;RDS&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 상단 서비스&lt;br /&gt;-&amp;gt;&amp;nbsp;데이터베이스 RDS &lt;br /&gt;-&amp;gt;&amp;nbsp;Amazon Relational Database Service(RDS) 데이터베이스 생성 &lt;br /&gt;-&amp;gt; 표준생성 체크, 엔진 선택, 템플릿 프리티어 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rds 프리티어.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/81fU9/btr2H7jySbh/aGBkJV31uf2X8hHR6Pkc51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/81fU9/btr2H7jySbh/aGBkJV31uf2X8hHR6Pkc51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/81fU9/btr2H7jySbh/aGBkJV31uf2X8hHR6Pkc51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F81fU9%2Fbtr2H7jySbh%2FaGBkJV31uf2X8hHR6Pkc51%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;1110&quot; height=&quot;259&quot; data-filename=&quot;rds 프리티어.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;gt;&amp;nbsp;db 인스턴트 식별자, 마스터 사용자 이름 및 비밀번호 입력 &lt;br /&gt;-&amp;gt;&amp;nbsp;인스턴스 구성 db.t2.micro 선택 &lt;br /&gt;-&amp;gt;&amp;nbsp;스토리지 스토리지 자동 조정 활성화 &lt;br /&gt;-&amp;gt;&amp;nbsp;연결 퍼블릭 엑세스 예 체크, 기존 VPC 보안 그룹 이전설정과 동일, 가용영역 선택(인스턴스에서 확인), 추가 구성 포트설정 &lt;br /&gt;-&amp;gt;&amp;nbsp;데이터베이스 생성(확인하기 - 엔드포인트 주소 복사해놓기) &lt;br /&gt;-&amp;gt;&amp;nbsp;EC2 보안그룹 - 인바운드 규칙 편집 - db선택 및 포트 추가 (사용자tcp 8080포트 Anywhere-IPv4) &lt;br /&gt;-&amp;gt;&amp;nbsp;db툴 접속후 host server에 엔드포인트를 입력하고 새 연결 생성하기 &lt;br /&gt;- MySQL Workbench - new connection - connection name에 db식별자 입력 - hostname에 엔드포인트 입력 - rds username 및 password 입력.&lt;br /&gt;-&amp;nbsp;IDE에서&amp;nbsp;rootconfig.java&amp;nbsp;변경하고&amp;nbsp;실행확인&lt;/p&gt;</description>
      <category>Web dev/Basic</category>
      <category>AWS</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/100</guid>
      <comments>https://a-develop.tistory.com/100#entry100comment</comments>
      <pubDate>Thu, 9 Mar 2023 12:25:37 +0900</pubDate>
    </item>
    <item>
      <title>target폴더, m2e-wtp 폴더란?</title>
      <link>https://a-develop.tistory.com/99</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브 사용 중 target - m2e-wtp 폴더가 자동으로 업데이트 되는 걸 보고 궁금해서 찾아보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;target폴더란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 빌드프로세스의 마지막 output을 포함하고 있으며 애플리케이션을 배포 또는 운영하는데 사용되기 때문에 빌드 과정에서 중요한 역할을 한다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;maven&amp;nbsp;Java&amp;nbsp;프로젝트에서&amp;nbsp;target&amp;nbsp;폴더는&amp;nbsp;빌드과정&amp;nbsp;중에&amp;nbsp;만들어지며&amp;nbsp;컴파일된&amp;nbsp;자바&amp;nbsp;코드와&amp;nbsp;애플리케이션을&amp;nbsp;구동하는데&amp;nbsp;필요한&amp;nbsp;다른&amp;nbsp;자원들을&amp;nbsp;포함한다. &lt;br /&gt;JAR 또는 WAR 파일과 같이 빌드 결과인 output이 target 폴더에 위치된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;m2e-wtp 폴더란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 웹애플리케이션이 빌드되고 적합한 설정파일과 함께 서버에 배포되는 데 중요한 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;m2e-wtp&amp;nbsp;폴더는&amp;nbsp;maven&amp;nbsp;웹&amp;nbsp;애플리케이션&amp;nbsp;개발&amp;nbsp;시&amp;nbsp;이클립스와&amp;nbsp;결합하는&amp;nbsp;빌드시스템으로써&amp;nbsp;사용된다. &lt;br /&gt;maven과 Eclipse를 통합하는 것을 돕는 설정파일을 포함한다. &lt;br /&gt;이 설정파일들은 웹 애플리케이션 파일의 위치, context root, deployment descriptor(배포서술자) 등을 명시한다.&lt;/p&gt;</description>
      <category>etc</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/99</guid>
      <comments>https://a-develop.tistory.com/99#entry99comment</comments>
      <pubDate>Wed, 8 Mar 2023 12:41:16 +0900</pubDate>
    </item>
    <item>
      <title>오류 AWS EC2 404 찾을 수 없음, IllegalStateException</title>
      <link>https://a-develop.tistory.com/98</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;상황&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS에 스프링 레거시 war 파일을 배포한 후, 주소창에 &quot;퍼블릭ip:8080&quot; 입력 시 톰캣 기본페이지는 잘 뜨는데 내 프로젝트명를 추가하면 404에러가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;HTTP 상태 404 &amp;ndash; 찾을&amp;nbsp;수&amp;nbsp;없음&lt;br /&gt;타입&amp;nbsp;상태&amp;nbsp;보고 &lt;br /&gt;메시지&amp;nbsp;The&amp;nbsp;requested&amp;nbsp;resource&amp;nbsp;[...]&amp;nbsp;is&amp;nbsp;not&amp;nbsp;available &lt;br /&gt;설명&amp;nbsp;Origin&amp;nbsp;서버가&amp;nbsp;대상&amp;nbsp;리소스를&amp;nbsp;위한&amp;nbsp;현재의&amp;nbsp;representation을&amp;nbsp;찾지&amp;nbsp;못했거나,&amp;nbsp;그것이&amp;nbsp;존재하는지를&amp;nbsp;밝히려&amp;nbsp;하지&amp;nbsp;않습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;톰캣 로그를 확인해 보니 프로젝트 실행 시 exception이 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;java.base@11.0.18/java.lang.Thread.run(Thread.java:829) &lt;br /&gt;06-Mar-2023&amp;nbsp;12:18:57.099&amp;nbsp;INFO&amp;nbsp;[mysql-cj-abandoned-connection-cleanup]&amp;nbsp;org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading&amp;nbsp;Illegal&amp;nbsp;access:&amp;nbsp;this&amp;nbsp;web&amp;nbsp;application&amp;nbsp;instance&amp;nbsp;has&amp;nbsp;been&amp;nbsp;stopped&amp;nbsp;already.&amp;nbsp;Could&amp;nbsp;not&amp;nbsp;load&amp;nbsp;[].&amp;nbsp;The&amp;nbsp;following&amp;nbsp;stack&amp;nbsp;trace&amp;nbsp;is&amp;nbsp;thrown&amp;nbsp;for&amp;nbsp;debugging&amp;nbsp;purposes&amp;nbsp;as&amp;nbsp;well&amp;nbsp;as&amp;nbsp;to&amp;nbsp;attempt&amp;nbsp;to&amp;nbsp;terminate&amp;nbsp;the&amp;nbsp;thread&amp;nbsp;which&amp;nbsp;caused&amp;nbsp;the&amp;nbsp;illegal&amp;nbsp;access. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;java.lang.IllegalStateException:&amp;nbsp;Illegal&amp;nbsp;access:&amp;nbsp;this&amp;nbsp;web&amp;nbsp;application&amp;nbsp;instance&amp;nbsp;has&amp;nbsp;been&amp;nbsp;stopped&amp;nbsp;already.&amp;nbsp;Could&amp;nbsp;not&amp;nbsp;load&amp;nbsp;[].&amp;nbsp;The&amp;nbsp;following&amp;nbsp;stack&amp;nbsp;trace&amp;nbsp;is&amp;nbsp;thrown&amp;nbsp;for&amp;nbsp;debugging&amp;nbsp;purposes&amp;nbsp;as&amp;nbsp;well&amp;nbsp;as&amp;nbsp;to&amp;nbsp;attempt&amp;nbsp;to&amp;nbsp;terminate&amp;nbsp;the&amp;nbsp;thread&amp;nbsp;which&amp;nbsp;caused&amp;nbsp;the&amp;nbsp;illegal&amp;nbsp;access. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1432) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1057) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.checkThreadContextClassLoader(AbandonedConnectionCleanupThread.java:123) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:90) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;java.base/java.lang.Thread.run(Thread.java:829)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;시도&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법1&lt;/b&gt; - server.xml&amp;nbsp;수정하기 &lt;br /&gt;&amp;lt;Host name=&quot;localhost&quot; ~&amp;gt; 밑에 아래 코드를 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1678126089245&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;Context docBase = &quot;WAR파일명&quot; path=&quot;/&quot; reloadable=&quot;false&quot;/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;결과 : 이번에는 &quot;퍼블릭ip:8080&quot;도 404에러가 떴다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;방법2&lt;/b&gt; - server.xml&amp;nbsp;수정하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트 8005을 8004로 변경한다.&lt;/p&gt;
&lt;pre id=&quot;code_1678126111365&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- &amp;lt;Server port=&quot;8005&quot; shutdown=&quot;SHUTDOWN&quot;&amp;gt; --&amp;gt;

&amp;lt;Server port=&quot;8004&quot; shutdown=&quot;SHUTDOWN&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;방법3&lt;/b&gt; - 톰캣&amp;nbsp;삭제후&amp;nbsp;재설치 &lt;br /&gt;sudo&amp;nbsp;apt-get&amp;nbsp;purge&amp;nbsp;--auto-remove&amp;nbsp;tomcat9 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;방법4&lt;/b&gt; - ROOT.war로&amp;nbsp;이름&amp;nbsp;변경&amp;nbsp;후&amp;nbsp;배포하기 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;방법5&lt;/b&gt; - 윈도우 방화벽 비활성화&lt;br /&gt;&lt;br /&gt;&lt;b&gt;방법6&lt;/b&gt; - AWS EC2 root 계정 활성화시키기&lt;br /&gt;&lt;br /&gt;&lt;b&gt;방법7&lt;/b&gt; - 톰캣&amp;nbsp;사용자,&amp;nbsp;그룹&amp;nbsp;생성&amp;nbsp;및&amp;nbsp;권한&amp;nbsp;주기 &lt;br /&gt;&lt;a href=&quot;https://btcd.tistory.com/120&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://btcd.tistory.com/120&lt;/a&gt;&amp;nbsp;참고 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;방법8&lt;/b&gt; - filezilla 대신 tomcat manager로 배포&lt;br /&gt;&lt;a href=&quot;https://yoonfeel-web.tistory.com/5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://yoonfeel-web.tistory.com/5&lt;/a&gt; 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;해결&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2 인스턴스 삭제 후 새로 만드니 정상 작동했다,,ㅎ&lt;/p&gt;</description>
      <category>Web dev/Error</category>
      <category>error</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/98</guid>
      <comments>https://a-develop.tistory.com/98#entry98comment</comments>
      <pubDate>Tue, 7 Mar 2023 03:01:04 +0900</pubDate>
    </item>
    <item>
      <title>GITHUB 사용법</title>
      <link>https://a-develop.tistory.com/97</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;기본&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 깃허브 접속 후 repository 생성하기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 로컬 저장소 설정 및 로컬에서 repository에 파일 업로드하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;github desktop&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 상단 file 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- clone repository&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 불러올 repository 선택 및 로컬에 저장할 위치 지정&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 내 컴퓨터 로컬 지정 폴더에 깃허브에 올릴 파일 넣기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- github desktop에 해당 파일이 표시됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 설명 작성 후 commit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- push&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;push 되돌리기 : 좌측 history에서 해당 기록 우클릭 - Revert changes in commit - 상단 Push origin&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;sourceTree&amp;gt;&amp;nbsp;사용법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&amp;nbsp;&amp;nbsp;깃허브 레포지토리 연결하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단 저장소 클릭 - 원격저장소 추가 - 깃허브 레포지토리 주소 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;2.&amp;nbsp;로컬&amp;nbsp;저장소&amp;nbsp;연결하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;새 탭 열기 - add - 깃허브 로컬 지정 폴더 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;3. ssh Key 생성 (Secure Shell) 및 등록&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;상단 도구 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SSH Key 생성 또는 불러오기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Generate&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- save public key / save private key&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; 상단 옵션 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SSH 클라이언트 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- private key 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;4. 깃허브에 ssh key 등록&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;깃허브 홈 우측 프로필 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- setting&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SSH and GPG keys&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- new SSH key&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공개키 등록하기 (sourceTree 상단 도구 클릭 -&amp;nbsp;SSH Key 생성 또는 불러오기&amp;nbsp;- Load - 박스 내용)&lt;/p&gt;</description>
      <category>Web dev/Basic</category>
      <category>git</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/97</guid>
      <comments>https://a-develop.tistory.com/97#entry97comment</comments>
      <pubDate>Thu, 2 Mar 2023 20:48:11 +0900</pubDate>
    </item>
    <item>
      <title>쿠키, 세션</title>
      <link>https://a-develop.tistory.com/96</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Cookie&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 사용자 컴퓨터에 저장. (정보 유출 가능성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 유효기간 후 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Session&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 클라이언트 별로 서버에 저장되는 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 서버 종료시, 유효기간 후 삭제 (마지막 사용 후 30분동안 유지)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rPkoU/btrWd0DQZlw/vYPEYo5DTHdyBEirzik8gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rPkoU/btrWd0DQZlw/vYPEYo5DTHdyBEirzik8gk/img.png&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;314&quot; data-is-animation=&quot;false&quot; data-filename=&quot;blob&quot; data-widthpercent=&quot;51.13&quot; style=&quot;width: 50.5335%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rPkoU/btrWd0DQZlw/vYPEYo5DTHdyBEirzik8gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrPkoU%2FbtrWd0DQZlw%2FvYPEYo5DTHdyBEirzik8gk%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;757&quot; height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2e14u/btrWefgApbu/nzkghgPY5O7gwKru2Z6h9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2e14u/btrWefgApbu/nzkghgPY5O7gwKru2Z6h9k/img.png&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;427&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.3037%;&quot; data-widthpercent=&quot;48.87&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2e14u/btrWefgApbu/nzkghgPY5O7gwKru2Z6h9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2e14u%2FbtrWefgApbu%2FnzkghgPY5O7gwKru2Z6h9k%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;984&quot; height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;참고 부스트코스 웹백엔드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;세션 처리 과정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 웹 클라이언트가 서버측에 요청을 보내면 서버는 session id를 발급한다. sessoion id를 이용해서 http session (key, value)을 생성한다. &lt;br /&gt;session&amp;nbsp;id로&amp;nbsp;cookie를&amp;nbsp;만들어서&amp;nbsp;client에&amp;nbsp;보낸다. &lt;br /&gt;객체는 서버가 만들어주기 때문에 직접 생성하지 않는다.&amp;nbsp; request.getSession() (=request.getSession(true)) 메서드 호출시 세션을 반환하며, 세션이 없으면 새로 생성해서 반환해준다.(isNew()메소드로 확인가능) &lt;br /&gt;request.getSession(false)&amp;nbsp;메서드&amp;nbsp;호출시&amp;nbsp;세션을&amp;nbsp;반환하며,&amp;nbsp;세션이&amp;nbsp;없다면&amp;nbsp;null을&amp;nbsp;반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ web.xml&amp;nbsp;태그로&amp;nbsp;세션&amp;nbsp;유지시간을&amp;nbsp;설정한다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677531301844&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;session.setAttribute(String name, Object value) // 세션에 값을 저장한다.
session.getAttribute(String name) // Object타입으로 값을 반환한다. 
removeAtrribute(String name) // 해당 정보만 삭제한다. 
invalidate() // 모든 정보 삭제
getId() // 세션에 할당된 유일한 식별자(ID)를 String 타입으로 반환한다.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web dev/Basic</category>
      <category>JSP servlet</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/96</guid>
      <comments>https://a-develop.tistory.com/96#entry96comment</comments>
      <pubDate>Tue, 28 Feb 2023 05:56:09 +0900</pubDate>
    </item>
    <item>
      <title>SPRING 웹소켓에서 HttpSession 값 불러오기</title>
      <link>https://a-develop.tistory.com/95</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개념&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;WebSocketSession과 HttpSession은 다르다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebSocketSession은 HttpServletResponse, HttpServletRequest 등 servlet 관련 클래스를 사용할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VO를 사용한 이용자 정보는 HttpSession에 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebSocket 접속자 정보는&lt;span&gt;&amp;nbsp;&lt;/span&gt;WebSocketHandler에서 WebSocketSession에 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HttpSessionHandshakeInterceptor를 사용하도록 설정하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;WebSocketHandler 동작(handshake)&lt;span&gt;&amp;nbsp;&lt;/span&gt;이전에&lt;span&gt;&amp;nbsp;&lt;/span&gt;HttpSession에 접근해 원하는 정보를&lt;span&gt;&amp;nbsp;&lt;/span&gt;WebSocketHandler로 전달할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;상황&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹소켓에서 HttpSession을 사용해서 현재 로그인 중인 회원 아이디&lt;span&gt;(MemberVO id)&lt;/span&gt;를 불러 오려 했으나 WebSocketSession의 id만 호출됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;+ HttpSessionHandshakeInterceptor는 등록한 상태이다. &lt;a href=&quot;https://a-develop.tistory.com/94&quot;&gt;스프링 웹소켓 기본설정 (Java Configuration)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;해결&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;session.getId()가 아니라 session.getAttributes()를 사용해서 값을 호출해 처리하면 된다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;ex) &lt;/b&gt;&lt;b&gt;[MyWebSocketHandler.java]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1676646398563&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//WebSocketSession id가 호출된다
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {

for (WebSocketSession s : sessionList) {
s.sendMessage(new TextMessage(session.getId() + &quot; : &quot; + message.getPayload()));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1676646408020&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//HttpSession id가 호출된다
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {

Map map = (Map)session.getAttributes();
MemberVO m = (MemberVO)map.get(&quot;memberInfo&quot;);
String id = m.getId();
for (WebSocketSession s : sessionList) {
s.sendMessage(new TextMessage(id + &quot; : &quot; + message.getPayload()));
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web dev/Basic</category>
      <category>spring</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/95</guid>
      <comments>https://a-develop.tistory.com/95#entry95comment</comments>
      <pubDate>Sun, 19 Feb 2023 00:01:41 +0900</pubDate>
    </item>
    <item>
      <title>SPRING 웹소켓 기본설정 (Java Configuration)</title>
      <link>https://a-develop.tistory.com/94</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;환경 &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 스프링 레거시, Maven, 자바 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;전체 코드&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[WebSocketConfig.java] &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: WebSocketConfig implements WebSocketConfigurer&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1676644549894&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
@RequiredArgsConstructor
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer{

private final MyWebSocketHandler myWebSocketHandler;

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myWebSocketHandler, &quot;/chatting&quot;)
.addInterceptors(new HttpSessionHandshakeInterceptor())
.setAllowedOrigins(&quot;*&quot;);
}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[WebConfig.java] &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1676644745285&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class&amp;lt;?&amp;gt;[] getRootConfigClasses() {
return new Class[] {RootConfig.class};
}

@Override
protected Class&amp;lt;?&amp;gt;[] getServletConfigClasses() {
return new Class[] {ServletConfig.class, WebSocketConfig.class};
}

@Override
protected String[] getServletMappings() {
return new String[] {&quot;/&quot;};
}

@Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        registration.setInitParameter(&quot;throwExceptionIfNoHandlerFound&quot;, &quot;true&quot;);
        registration.setInitParameter(&quot;dispatchOptionsRequest&quot;, &quot;true&quot;);
        registration.setLoadOnStartup(1);
}

@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding(&quot;UTF-8&quot;);
return new Filter[] {encodingFilter};
}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[MyWebSocketHandler.java]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: MyWebSocketHandler extends TextWebSocketHandler&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1676644796379&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class MyWebSocketHandler extends TextWebSocketHandler {

List&amp;lt;WebSocketSession&amp;gt; sessionList = new ArrayList&amp;lt;&amp;gt;();

//소켓 open
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
System.out.println(&quot;연결됨... =&amp;gt;&quot; + session);
sessionList.add(session);
}

//전체채팅
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
 System.out.println((&quot;id로 부터 message 받음 =&amp;gt;&quot;+ session.getId()+ message.getPayload()));
        for (WebSocketSession s : sessionList) {
            s.sendMessage(new TextMessage(session.getId() + &quot; : &quot; + message.getPayload()));
          }
        }


// 소켓 close
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessionList.remove(session);
System.out.println(&quot;연결 해제..... =&amp;gt;&quot; + session + &quot; : &quot; +  session.getId());
}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ChatController.java]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1676644846540&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
@Log4j
@RequestMapping(&quot;/chat/*&quot;)
@AllArgsConstructor
public class ChatController {

@RequestMapping(value= &quot;/chatting&quot;,  method = { RequestMethod.GET })
public String chat() {

return &quot;/chat/chatting&quot;;
}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[.jsp]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1676644881828&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
var ws;

$(document).ready(function() {
connect();
});

function connect() {
     ws = new WebSocket(&quot;ws://localhost:8011/controller/chatting&quot;);

ws.onopen = function() {
console.log('socket opend')
};

ws.onmessage = function(event) {
console.log(&quot;.....onmessage&quot; + event.data)
};

ws.onclose = function(event) {
console.log('socket closed')
}
}

$('button').on(&quot;click&quot;, function(e){
e.preventDefault();
var msg = document.getElementById(&quot;inputmessage&quot;).value;
ws.send(msg);
msg = &quot;&quot;;
});
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;input type=&quot;text&quot; id=&quot;inputmessage&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;button type=&quot;button&quot;&amp;gt;메세지 전송&amp;lt;/button&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web dev/Basic</category>
      <category>spring</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/94</guid>
      <comments>https://a-develop.tistory.com/94#entry94comment</comments>
      <pubDate>Sat, 18 Feb 2023 00:02:35 +0900</pubDate>
    </item>
    <item>
      <title>오류 WebSocket connection to 'xxx' failed, Provisional headers are shown</title>
      <link>https://a-develop.tistory.com/93</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;상황&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채팅프로젝트 중 웹소켓이 연결되지 않는 문제가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IDE에서는 아무 응답이 없었고, 개발자 도구에서 아래 오류들을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebSocket connection to 'ws://URL' failed:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6mt15/btrZqFw8rr4/V1hJXGjyZBt22psCK9XmD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6mt15/btrZqFw8rr4/V1hJXGjyZBt22psCK9XmD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6mt15/btrZqFw8rr4/V1hJXGjyZBt22psCK9XmD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6mt15%2FbtrZqFw8rr4%2FV1hJXGjyZBt22psCK9XmD0%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;850&quot; height=&quot;64&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[source]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qcQrZ/btrZttveIZd/kl4dfBwzK1mKyUD5x6OqsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qcQrZ/btrZttveIZd/kl4dfBwzK1mKyUD5x6OqsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qcQrZ/btrZttveIZd/kl4dfBwzK1mKyUD5x6OqsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqcQrZ%2FbtrZttveIZd%2Fkl4dfBwzK1mKyUD5x6OqsK%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;840&quot; height=&quot;66&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[network]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Provisional headers are shown&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;945&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vJLxg/btrZryD4UyQ/oRTU9rHkxRuHA4KRAiRECk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vJLxg/btrZryD4UyQ/oRTU9rHkxRuHA4KRAiRECk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vJLxg/btrZryD4UyQ/oRTU9rHkxRuHA4KRAiRECk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvJLxg%2FbtrZryD4UyQ%2FoRTU9rHkxRuHA4KRAiRECk%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;945&quot; height=&quot;228&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정파일의 registerWebSocketHandlers URL과 View의&lt;span&gt; WebSocket URL을&lt;/span&gt;&amp;nbsp;동일하게 맞춰준다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;※ Controller return문처럼 jsp파일의 폴더명을 함께 쓰면 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[WebSocketConfig.java]&lt;/p&gt;
&lt;pre id=&quot;code_1676513816577&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(chatHandler(), &quot;/chatting&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[chatting.jsp]&lt;/p&gt;
&lt;pre id=&quot;code_1676649497258&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//오류

ws = new WebSocket(&quot;ws://localhost:8011/controller/chat/chatting&quot;);
//기본경로 + 폴더명 + registerWebSocketHandlers URL (x)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1676513797745&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//해결

ws = new WebSocket(&quot;ws://localhost:8011/controller/chatting&quot;);
//프로젝트 기본경로 + registerWebSocketHandlers URL (o)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web dev/Error</category>
      <category>error</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/93</guid>
      <comments>https://a-develop.tistory.com/93#entry93comment</comments>
      <pubDate>Fri, 17 Feb 2023 00:01:25 +0900</pubDate>
    </item>
    <item>
      <title>JAVASCRIPT 이벤트 처리</title>
      <link>https://a-develop.tistory.com/92</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. addEventListener &quot;click&quot;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 오류 &lt;i&gt;&quot;Uncaught TypeError: Cannot read property 'addEventListener' of null&quot;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: addEventListener 사용 시 &amp;lt;script&amp;gt;태그를 &amp;lt;head&amp;gt;부분이나 &amp;lt;body&amp;gt;부분 상단 넣으니 위 오류가 발생했다. &amp;lt;body&amp;gt;부분 하단으로 옮겨주니 정상작동했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676356192928&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;button class=&quot;register_btn&quot; type=&quot;button&quot;&amp;gt;글쓰기&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;javascipt&amp;gt;
const registerButton = document.querySelector('.register-btn')
registerButton.addEventListener('click', register);

function register(){
self.location = &quot;/controller/board/register&quot;
}
&amp;lt;/javascipt&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676356274526&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;button class=&quot;register_btn&quot; type=&quot;button&quot;&amp;gt;글쓰기&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;javascript&amp;gt;
const registerButton = document.querySelector('.register-btn')

registerButton.addEventListener(&quot;click&quot;, function(){
self.location = &quot;/controller/board/register&quot;
})
&amp;lt;/javascript&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. on &quot;click&quot;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676356367125&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;button class=&quot;register_btn&quot; type=&quot;button&quot;&amp;gt;글쓰기&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;javascript&amp;gt;
$(&quot;.register-btn&quot;).on(&quot;click&quot;, function(){
self.location = &quot;/controller/board/register&quot; //javascript에서 url로 이동하기
})
&amp;lt;/javascript&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web dev/Basic</category>
      <category>javascript jquery</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/92</guid>
      <comments>https://a-develop.tistory.com/92#entry92comment</comments>
      <pubDate>Thu, 16 Feb 2023 00:34:34 +0900</pubDate>
    </item>
    <item>
      <title>HTML CSS 추가 기능</title>
      <link>https://a-develop.tistory.com/91</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;애니매이션 효과&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676354935191&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@keyframes rotate {
100%{ //애니메이션 총시간 시간대비 퍼센트
transform: rotate(360deg); //회전(몇도)
}

.클래스명 {
    width: 100%;
    height: auto;
    animation: rotate 1.1s infinite linear; //infinite 계속돈다, linear 가속도붙지 않고 일정한 속도로 돈다.
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모달창 마우스 스크롤 해도 따라오도록 하기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676354929598&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#modal {
    position: fixed;
 top: 0;
    left: 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;박스 그림자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;box-shadow : offset-x, offset-y, blur-radius, spread-radius, color(0 0 0 색상정도)&lt;/p&gt;
&lt;pre id=&quot;code_1676354923567&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;box-shadow : 2px 2px 2px 1px rgba(0, 0, 0, 0.2);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;flex&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(IE&amp;nbsp;10,&amp;nbsp;11에서&amp;nbsp;flex를&amp;nbsp;부분&amp;nbsp;지원,&amp;nbsp;이전&amp;nbsp;버전은&amp;nbsp;지원하지&amp;nbsp;않는다.)&lt;/p&gt;
&lt;pre id=&quot;code_1676354983630&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;display:flex; //요소를 동일한 간격으로 배치
flex-direction: column //각 요소를 세로로 배치
justify-content //각 요소를 가로로 배치
align-items //세로(세로를 기준으로 정렬....)
position:relative //relative를 가지고 있는 요소를 기준으로 한다...&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web dev/Basic</category>
      <category>HTML CSS</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/91</guid>
      <comments>https://a-develop.tistory.com/91#entry91comment</comments>
      <pubDate>Wed, 15 Feb 2023 00:11:01 +0900</pubDate>
    </item>
    <item>
      <title>HTML CSS 기본</title>
      <link>https://a-develop.tistory.com/90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;최대한&amp;nbsp;불필요한&amp;nbsp;태그,&amp;nbsp;스타일&amp;nbsp;없애기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;협업으로&amp;nbsp;웹페이지&amp;nbsp;만드는&amp;nbsp;법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자이너&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 디자인(포토샾, 피그마 등)해서 파일(파일+이미지리소스)을 넘긴다.&lt;br /&gt;-&amp;gt; &lt;br /&gt;웹디자이너,&amp;nbsp;퍼블리셔,&amp;nbsp;프론트엔드&amp;nbsp;개발자&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 전체 골격을 확인하고 블록 구분 후 블록마다 클래스명 설계 등을 논의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마크업&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;html의&amp;nbsp;뼈대를&amp;nbsp;잡아주는&amp;nbsp;html을&amp;nbsp;작성하는&amp;nbsp;일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: html5 이전에는 div태그로 문서의 구조를 표현했다. 하지만 html5는 &amp;lt;selection, headerm article, footer 등의 태그를 사용해 문서 구조를 정확하게 표현할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;css우선순위&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;style &amp;gt; id(태그 내 하나) &amp;gt; class(태그 내 여러개) &amp;gt; 태그&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;(+ div style로 적용안되던 걸 a style로 바꾸니까 적용됐다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;요소&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inline&amp;nbsp;요소&amp;nbsp;:&amp;nbsp;문자&amp;nbsp;등&amp;nbsp;직선적인&amp;nbsp;html&amp;nbsp;요소 &lt;br /&gt;block&amp;nbsp;요소&amp;nbsp;:&amp;nbsp;이미지&amp;nbsp;등&amp;nbsp;부피가&amp;nbsp;있는&amp;nbsp;요소 &lt;br /&gt;form태그&amp;nbsp;:&amp;nbsp;정보&amp;nbsp;전송 &lt;br /&gt;input&amp;nbsp;태그&amp;nbsp;:&amp;nbsp;입력칸을&amp;nbsp;만듦 &lt;br /&gt;html과&amp;nbsp;css를&amp;nbsp;연결하기&amp;nbsp;위해&amp;nbsp;head&amp;nbsp;사이에&amp;nbsp;&amp;lt;link&amp;nbsp;rel=&quot;stylesheet&quot;&amp;nbsp;href=&quot;style.css&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;div&amp;gt;&amp;nbsp;영역&amp;nbsp;나눔 &lt;br /&gt;&amp;lt;p&amp;gt;&amp;nbsp;문단&amp;nbsp;나눔 &lt;br /&gt;&amp;lt;span&amp;gt;&amp;nbsp;일정&amp;nbsp;범위에&amp;nbsp;속성을&amp;nbsp;줌&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;html, body&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: width기본값 100% (width: 100%)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;img&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 이미지는 width를 정해주면 자동으로 height를 잡음 &lt;br /&gt;&lt;br /&gt;폰트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 용량이 커서 몇번 쓰이지 않는다면 그 폰트를 쓴 이미지를 만들어서 이미지를 사용하는 게 나아.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RGB 색 모형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: red green blue 세가지 색을 이용하여 색을 표현하는 방식. (가산 혼합)&lt;/p&gt;</description>
      <category>Web dev/Basic</category>
      <category>HTML CSS</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/90</guid>
      <comments>https://a-develop.tistory.com/90#entry90comment</comments>
      <pubDate>Tue, 14 Feb 2023 15:04:01 +0900</pubDate>
    </item>
    <item>
      <title>SPRING mybatis &amp;lt;selectKey&amp;gt;</title>
      <link>https://a-develop.tistory.com/89</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;: 자동 증가를 설정한 PK값을 &amp;lt;selectKey&amp;gt;태그를 통해 수동으로 얻어와 그 결과를 이용할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;예를 들어, 게시판에 게시글 등록 후 &quot;00번 게시글이 등록되었습니다&quot;라는 모달창을 띄울 때 사용할 수 있다. &lt;br /&gt;&lt;br /&gt;게시글 번호를 자동 증가하도록 설정한 후 단순 &amp;lt;insert&amp;gt; 태그를 사용해서 글을 등록하고 해당 객체에서 게시글 번호를 얻어오면 모두 '0'으로 출력된다. (MySQL)&lt;br /&gt;&amp;lt;selectKey&amp;gt;태그로 새 글 등록 전 글번호에서 1을 더한 값를 얻어온 후 그 결과를 방금 등록한 게시글 번호로 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ &amp;lt;selectkey&amp;gt; order속성 BEFORE를 사용할 경우 첫 글을 게시할 시 이전글 번호(boardno)가 없어서 sql문에서 에러가 방생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;selectkey&amp;gt; order속성 AFTER를 사용하니 해결됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;mapper Interface&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676037473689&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void insertSelectKey(BoardVO board);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;mapper XML&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676037461889&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- 첫 글 게시 시 오류--&amp;gt;

&amp;lt;insert id=&quot;insertSelectKey&quot;&amp;gt;

&amp;lt;selectKey keyProperty=&quot;boardno&quot; order=&quot;BEFORE&quot;
resultType=&quot;int&quot;&amp;gt;
select MAX(boardno)+1 from boards
&amp;lt;/selectKey&amp;gt;

insert into boards
(boardno, title, content, writer, deletestate,
boardtype, registerdate, updatedate) 
values 
(#{boardno}, #{title},
#{content}, #{writer}, default, default, default, default)

&amp;lt;/insert&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1676648254827&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- 정상 작동--&amp;gt;

&amp;lt;insert id = &quot;insertSelectKey&quot;&amp;gt;

insert into boards
(boardno, title, content, id, state,
boardtype, registerdate, updatedate) 
values 
(#{boardno}, #{title},
#{content}, #{id}, default, default, default, default)

&amp;lt;selectKey keyProperty=&quot;boardno&quot; order=&quot;AFTER&quot; resultType=&quot;int&quot;&amp;gt;
select MAX(boardno) from boards
&amp;lt;/selectKey&amp;gt;

&amp;lt;/insert&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web dev/Basic</category>
      <category>spring</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/89</guid>
      <comments>https://a-develop.tistory.com/89#entry89comment</comments>
      <pubDate>Mon, 13 Feb 2023 00:05:12 +0900</pubDate>
    </item>
    <item>
      <title>오류 java.lang.IllegalArgumentException 요청 타겟에서 유효하지 않은 문자가 발견되었습니다.</title>
      <link>https://a-develop.tistory.com/87</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;상황&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@GetMapping을 사용했고 URL로 list[] 인덱스를 사용해 직접 값을 전송해주던 중에 아래 오류가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;INFO:&amp;nbsp;HTTP&amp;nbsp;요청&amp;nbsp;헤더를&amp;nbsp;파싱하는&amp;nbsp;중&amp;nbsp;오류&amp;nbsp;발생 &lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;비고:&amp;nbsp;HTTP&amp;nbsp;요청&amp;nbsp;파싱&amp;nbsp;오류들이&amp;nbsp;더&amp;nbsp;발생하는&amp;nbsp;경우&amp;nbsp;DEBUG&amp;nbsp;레벨&amp;nbsp;로그로&amp;nbsp;기록될&amp;nbsp;것입니다. &lt;/i&gt;&lt;br /&gt;&lt;i&gt;java.lang.IllegalArgumentException:&amp;nbsp;요청&amp;nbsp;타겟에서&amp;nbsp;유효하지&amp;nbsp;않은&amp;nbsp;문자가&amp;nbsp;발견되었습니다.&amp;nbsp;유효한&amp;nbsp;문자들은&amp;nbsp;RFC&amp;nbsp;7230과&amp;nbsp;RFC&amp;nbsp;3986에&amp;nbsp;정의되어&amp;nbsp;있습니다. &lt;/i&gt;&lt;br /&gt;&lt;i&gt;at&amp;nbsp;org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:494) &lt;/i&gt;&lt;br /&gt;&lt;i&gt;at&amp;nbsp;org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:271) &lt;/i&gt;&lt;br /&gt;&lt;i&gt;at&amp;nbsp;org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) &lt;/i&gt;&lt;br /&gt;&lt;i&gt;at&amp;nbsp;org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) &lt;/i&gt;&lt;br /&gt;&lt;i&gt;at&amp;nbsp;org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789) &lt;/i&gt;&lt;br /&gt;&lt;i&gt;at&amp;nbsp;org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) &lt;/i&gt;&lt;br /&gt;&lt;i&gt;at&amp;nbsp;org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) &lt;/i&gt;&lt;br /&gt;&lt;i&gt;at&amp;nbsp;org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) &lt;/i&gt;&lt;br /&gt;&lt;i&gt;at&amp;nbsp;org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) &lt;/i&gt;&lt;br /&gt;&lt;i&gt;at&amp;nbsp;java.base/java.lang.Thread.run(Thread.java:834)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;톰캣 버전에 따라 문자열에서 특수문자를 허용하지 않는 경우가 있다. (tomcat9)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url에서 특수문자 '&lt;b&gt;['&lt;/b&gt;는 &lt;b&gt;%5B&lt;/b&gt; , 특수문자 '&lt;b&gt;]'&lt;/b&gt;는 &lt;b&gt;%5D&lt;/b&gt;로 변경한다.&lt;/p&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;910&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd9wRa/btrYpmjF2G8/cAMMNFYKAo643G0AXSpIP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd9wRa/btrYpmjF2G8/cAMMNFYKAo643G0AXSpIP1/img.png&quot; data-alt=&quot;url 오류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd9wRa/btrYpmjF2G8/cAMMNFYKAo643G0AXSpIP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd9wRa%2FbtrYpmjF2G8%2FcAMMNFYKAo643G0AXSpIP1%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;910&quot; height=&quot;61&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;61&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;url 오류&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&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;1156&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w6b0g/btrYjEzcDZy/awohFNaXEXxTlHCYisQTxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w6b0g/btrYjEzcDZy/awohFNaXEXxTlHCYisQTxk/img.png&quot; data-alt=&quot;해결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w6b0g/btrYjEzcDZy/awohFNaXEXxTlHCYisQTxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw6b0g%2FbtrYjEzcDZy%2FawohFNaXEXxTlHCYisQTxk%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;1156&quot; height=&quot;39&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;39&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Web dev/Error</category>
      <category>error</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/87</guid>
      <comments>https://a-develop.tistory.com/87#entry87comment</comments>
      <pubDate>Sun, 12 Feb 2023 00:09:45 +0900</pubDate>
    </item>
    <item>
      <title>오류 UnsatisfiedDependencyException</title>
      <link>https://a-develop.tistory.com/88</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;b&gt;상황&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Autowired 의존성 자동주입을 사용하던 중 아래와 같이 동일한 타입의 빈이 2개 발견된다는 에러가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;ERROR:&amp;nbsp;org.springframework.test.context.TestContextManager&amp;nbsp;-&amp;nbsp;Caught&amp;nbsp;exception&amp;nbsp;while&amp;nbsp;allowing&amp;nbsp;TestExecutionListener&amp;nbsp;[org.springframework.test.context.support.DependencyInjectionTestExecutionListener@bd4dc25]&amp;nbsp;to&amp;nbsp;prepare&amp;nbsp;test&amp;nbsp;instance&amp;nbsp;[com.toy.mapper.BoardServiceTests@35d3ab60]&lt;/i&gt;&lt;br /&gt;&lt;i&gt;org.springframework.beans.factory.UnsatisfiedDependencyException:&amp;nbsp;Error&amp;nbsp;creating&amp;nbsp;bean&amp;nbsp;with&amp;nbsp;name&amp;nbsp;'com.toy.mapper.BoardServiceTests':&amp;nbsp;Unsatisfied&amp;nbsp;dependency&amp;nbsp;expressed&amp;nbsp;through&amp;nbsp;method&amp;nbsp;'setService'&amp;nbsp;parameter&amp;nbsp;0;&amp;nbsp;nested&amp;nbsp;exception&amp;nbsp;is&amp;nbsp;org.springframework.beans.factory.NoUniqueBeanDefinitionException:&amp;nbsp;No&amp;nbsp;qualifying&amp;nbsp;bean&amp;nbsp;of&amp;nbsp;type&amp;nbsp;'com.toy.board.BoardService'&amp;nbsp;available:&amp;nbsp;expected&amp;nbsp;single&amp;nbsp;matching&amp;nbsp;bean&amp;nbsp;but&amp;nbsp;found&amp;nbsp;2:&amp;nbsp;boardServiceImpl,boardService&lt;/i&gt;&lt;br /&gt;&lt;i&gt;at&amp;nbsp;org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:667)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류코드에 BoardService타입이 boardServiceImpl, boardService 2개 발견된다고 적혀있기때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&quot;found 2: boardServiceImpl,boardService&quot;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;중에&amp;nbsp;하나를&amp;nbsp;필드명으로&amp;nbsp;명시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1676649615156&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//오류

@Setter(onMethod_= {@Autowired})
private BoardService service;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1676649624002&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//해결

@Setter(onMethod_= {@Autowired})
private BoardService boardService;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web dev/Error</category>
      <category>error</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/88</guid>
      <comments>https://a-develop.tistory.com/88#entry88comment</comments>
      <pubDate>Sat, 11 Feb 2023 00:01:10 +0900</pubDate>
    </item>
    <item>
      <title>프로젝트 네이밍 규칙</title>
      <link>https://a-develop.tistory.com/86</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 표기법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;카멜&amp;nbsp;표기법(camelCase)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 첫 단어를 제외한 첫 문자는 대문자이며 나머지는 소문자이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;파스칼&amp;nbsp;(PascalCase)&amp;nbsp;표기법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 명사로 시작하며, 단어마다 첫 문자는 대문자, 나머지는 소문자이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Snake_case 표기법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;: 각 단어를 언더바(_)로 구분한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;헝가리아 표기법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 접두사로 자료형 등을 표기한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Java&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 의미를 제대로 표현할 수 있는 이름을 짓는다. 길이 제한은 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 예약어를 사용하지 않는다. (&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;continue, &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;default, &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;do,&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;for, &lt;/span&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;native, &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;new, &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;super, &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;switch, &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;this 등)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 특수문자는 언더바(_)와 $만 허용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;패키지명 : 소문자 (한단어 권장)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;클래스명 : 파스칼 표기법.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;메소드명 : 카멜 표기법. 동사로 시작.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;변수명 : 파스칼 표기법 또는 소문자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;상수 : 대문자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Table&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.1 Oracle&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 대문자를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;schema명 :&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;테이블명 : &lt;span style=&quot;color: #000000;&quot;&gt;Snake_case&lt;/span&gt;. 접두사로 TBL_, T_를 붙인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;컬럼명 : &lt;span style=&quot;color: #000000;&quot;&gt;Snake_case&lt;/span&gt;. 각 단어는 최대 8글자를 넘지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Primary Key명 :&amp;nbsp; PK_테이블명&lt;br /&gt;Foreign Key명 : 접미사 _FK를 붙인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시퀀스명 : 접두사 SEQ_를 붙인다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.2 MySQL&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 소문자를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: snake_case 표기법을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 헝가리안 표기법을 사용하지 않는다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블명 : 집단명나 또는 복수형.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;컬럼명 :&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;단수형.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Foreign Key명 : 테이블병 _FK_숫자 또는 테이블병 _FK_컬럼명.&lt;/p&gt;</description>
      <category>etc</category>
      <category>java</category>
      <category>SQL</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/86</guid>
      <comments>https://a-develop.tistory.com/86#entry86comment</comments>
      <pubDate>Fri, 10 Feb 2023 00:03:31 +0900</pubDate>
    </item>
    <item>
      <title>MYSQL 설치 및 기본설정</title>
      <link>https://a-develop.tistory.com/85</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 설치 방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mysql 홈페이지에서 community 버전 installer를 다운받는다. &lt;br /&gt;설치 중 ROOT 계정의 비밀번호를 입력하고 user accounts를 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Workbench 사용법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1) 계정 생성 및 권한 부여&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ROOT계정에 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 Navigator - Users and Privileges - Add Account - login 아이디 비밀번호 입력 - Administrative Roles 부여할 권한 체크 (DBA 체크 시 전체 권한 부여)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2) 새 연결&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Home - MySQL Connections 플러스 버튼 클릭 -&amp;nbsp; 계정 아이디 비밀번호 입력 - test Connection - OK&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3) db 및 테이블 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;show&amp;nbsp;databases;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;create&amp;nbsp;database&lt;/b&gt;&amp;nbsp;firstDB&amp;nbsp;default&amp;nbsp;character&amp;nbsp;set&amp;nbsp;utf8;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;use&lt;/b&gt; firstDB;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;create table&lt;/b&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;item (&lt;/span&gt;&lt;br /&gt;item_id int auto_increment,&lt;br /&gt;item_name&amp;nbsp;varchar(30)&amp;nbsp;not&amp;nbsp;null,&amp;nbsp;&lt;br /&gt;resister_date date default (current_date),&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;primary key(boardno);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//create table&lt;/b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;if&amp;nbsp;not&amp;nbsp;exists&amp;nbsp;item (&lt;/span&gt;&lt;br /&gt;item_id&amp;nbsp;int&amp;nbsp;auto_increment&amp;nbsp;primary&amp;nbsp;key,&lt;br /&gt;item_name&amp;nbsp;varchar(30)&amp;nbsp;not&amp;nbsp;null,&amp;nbsp;&lt;br /&gt;resister_date date default (current_date)) engine=InnoDB;&lt;br /&gt;&lt;br /&gt;describe&amp;nbsp;item;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;insert into&lt;/b&gt; item (item_name, resister_date) values('banana', now());&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;item;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4) 추가&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;auto_increment&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676527154427&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;alter table 테이블명 modify 컬럼명 타입 auto_increment;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf) 값 자동 증가 : auto_increment(MySQL) / 시퀀스.NEXTVAL(Oracle)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;foreign key&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676527158195&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//추가
alter table 테이블명 add foreign key (컬럼명) references 참조테이블 (참조컬럼명);

//삭제
alter table 테이블명 drop foreign key 제약조건명;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컬럼&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676574469465&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;alter table 테이블명 add 컬럼명 자료형;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5) 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 Nevigator - SCHEMAS - 원하는 테이블, 칼럼 느낌표 클릭 - DDL&lt;/p&gt;</description>
      <category>Web dev/Basic</category>
      <category>db</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/85</guid>
      <comments>https://a-develop.tistory.com/85#entry85comment</comments>
      <pubDate>Thu, 9 Feb 2023 00:05:46 +0900</pubDate>
    </item>
    <item>
      <title>SPRING 의존성 주입</title>
      <link>https://a-develop.tistory.com/84</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 의존성 주입 설정&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;root-context에 component-scan 추가&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;root-context.xml -&amp;gt; Namespaces탭 -&amp;gt; context체크 -&amp;gt; root-context.xml에 코드 추가&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675931834999&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;context:component-scan base-package=&quot;com.toy.sample&quot;/&amp;gt;
&amp;lt;/context:component-scan&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RootCconfig.java에 코드 추가&lt;/p&gt;
&lt;pre id=&quot;code_1675931904985&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
@ComponentScan(basePackages= {&quot;com.toy.sample&quot;})
public class RootConfig {&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 의존성 주입 방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 생성자 주입과 setter 주입 방법 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 생성자 주입 &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 생성자를 정의 후 주입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) @Component + 생성자 생성&lt;/p&gt;
&lt;pre id=&quot;code_1676516182603&quot; class=&quot;less&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
@Data //Lombok의 setter, 생성자, toString 등을 자동으로 생성한다 
public class Chef {&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1675434159650&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
@ToString
@Getter
public class Hotel {
private Chef chef;

public Hotel(Chef chef) {
this.chef = chef;
}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 묵시적 생성자 주입 (&lt;b&gt;spring 4.3 이후)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span&gt;:&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ex) @Component + @AllArgsConstructor&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676516094206&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
@Data //Lombok의 setter, 생성자, toString 등을 자동으로 생성한다 
public class Chef {&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1675434527643&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
@ToString
@Getter
@AllArgsConstructor //인스턴스 변수로 선언된 모든 것을 파라미터로 받는 생성자를 만든다.
public class Hotel {
private Chef chef;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) @Controller + @RequiredArgsConstructor&lt;/p&gt;
&lt;pre id=&quot;code_1676515513326&quot; class=&quot;scala&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class MyWebSocketHandler extends TextWebSocketHandler {&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1676515513327&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
@RequiredArgsConstructor
public class WebSocketConfig implements WebSocketConfigurer{

private final MyWebSocketHandler myWebSocketHandler;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) setter주입&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: @Setter set메소드 작성 후 @Autowired 등 어노테이션 추가해 생성자를 주입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;pre id=&quot;code_1675434190570&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { RootConfig.class })
@Log4j
public class HotelTests {

@Setter(onMethod_ = { @Autowired })
private Hotel hotel;

@Test
public void testExist() {

assertNotNull(hotel);

log.info(hotel);
log.info(&quot;-------&quot;);
log.info(hotel.getChef());
}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) @Configuration + @Bean&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;pre id=&quot;code_1676515228791&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
public class WebSocketConfig implements WebSocketConfigurer{

@Bean
public MyWebSocketHandler chatHandler() {
return new MyWebSocketHandler();
}

//@RequiredArgsConstructor : @NonNull, final이 붙은 인스턴스 변수에 대한 생성자를 만든다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드로 배우는 스프링 웹 프로젝트&lt;/p&gt;</description>
      <category>Web dev/Basic</category>
      <category>spring</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/84</guid>
      <comments>https://a-develop.tistory.com/84#entry84comment</comments>
      <pubDate>Wed, 8 Feb 2023 00:01:53 +0900</pubDate>
    </item>
    <item>
      <title>SPRING 테스트 코드 작성</title>
      <link>https://a-develop.tistory.com/83</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;: spring-test 모듈을 이용해 스프링을 간단하게 가동한다. (Junit 4.0이상)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675432901347&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {RootConfig.class}) 
@Log4j 
public class 테스트클래스명 {

	@Setter(onMethod_ = @Autowired) //생성자 주입
	private 필드타입 필드명;
    
	@Test //JUnit에서 테스트 대상 표시
	public void 테스트메소드명() {
    
    ...
    
    }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Controller&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675992193889&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = { RootConfig.class, ServletConfig.class })
@Log4j
public class 테스트클래스명 {

	@Setter(onMethod_ = @Autowired) //생성자 주입    
   	private WebApplicationContext ctx;
	
	private MockMvc mockMvc;
    
    	@Before //테스트 전에 항상 실행되는 메소드
	public void setup() { 
		this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build(); //초기화			
	}
    
	@Test
	public void testList() throws Exception {
		
		log.info(mockMvc.perform(MockMvcRequestBuilders.호출방식(&quot;호출할 URL&quot;))
				.andReturn()
				.getModelAndView()
				.getModelMap()); //.getViewName());   
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;테스트 관련 어노테이션&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;@Runwith(SpringJUnit4ClassRunner.class)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 테스트 시 필요한 클래스(SpringJUnit4 ClassRunner)를 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 해당 테스트 코드가 스프링 실행 역할 한다는 것을 뜻한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;@ContextConfiguration&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 스프링이 실행될 때 어떤 설정정보을 읽을지 명시한다. 자동생성된 RootConfig.java(root-context.xml)와 ServletConfig.java(servlet-context.xml)의 경로를 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정된 클래스나 문자열을 이용해 필요한 객체를 스프링의 Bean으로 등록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;pre id=&quot;code_1675589866407&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//XML 설정
@ContextConfiguration(classes= {RootConfig.class}) 

//JAVA 설정
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;@Log4j&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: Lombok을 이용해서 로그를 기록하는 Logger를 변수로 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&amp;nbsp;@Test&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 단위 테스트 대상을 표시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Tomcat(WAS)을 실행하지 않는 테스트 - Controller&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;@WebAppConfiguration&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 빈을 등록한다. ServletContext - WebApplicationContext를 이용하기 위해 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;@Before&lt;/b&gt;&amp;nbsp;(import org.junit.Before)&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 테스트 전에 항상 실행되는 메서드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MockMvc&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: springMVC 테스트를 도와주는 가짜 URL과 파라미터 등을 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MockMvcRequestBuilders&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 설정한 호출방식으로 request 요청을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;+ 실행 결과 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: Run As - &amp;gt; Junit Test&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실전&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;mapper테스트&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VO.java&lt;/p&gt;
&lt;pre id=&quot;code_1675910170712&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Data
public class BoardsVO {

	private int boardno;
	private String boardtitle;
	private String boardcontent;
	private String boardwriter;
	private int boarddelet;
	private int boardtype;
	private Date registerdate;
	private Date updatedate;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mapperInterface.java&lt;/p&gt;
&lt;pre id=&quot;code_1675910114520&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface BoardsMapper {

	@Select(&quot;select * from boards where boardno&amp;gt;0&quot;)
	public List&amp;lt;BoardsVO&amp;gt; getList();
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mapperTests.java&lt;/p&gt;
&lt;pre id=&quot;code_1675910056723&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { RootConfig.class })
@Log4j
public class BoardsMapperTests {

	@Setter(onMethod_ = @Autowired)
	private BoardsMapper mapper;

	@Test
	public void testGetList() {

		//람다식 반복처리
		mapper.getList().forEach(B -&amp;gt; log.info(B));

		//향상된 for문
//		List&amp;lt;BoardsVO&amp;gt; list = (ArrayList&amp;lt;BoardsVO&amp;gt;) mapper.getList();
//		for (BoardsVO board : list) {
//			System.out.println(board);
//		}
		
		//for문
//		List&amp;lt;BoardsVO&amp;gt; list = (ArrayList&amp;lt;BoardsVO&amp;gt;) mapper.getList();
//		for(int i = 0; i&amp;gt;list.size(); i++) {
//			log.info(list.get(i));
//		}

	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dF95UF/btrYDgpFR0X/tYbIzKrAY0aZHG4xv0dmu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dF95UF/btrYDgpFR0X/tYbIzKrAY0aZHG4xv0dmu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dF95UF/btrYDgpFR0X/tYbIzKrAY0aZHG4xv0dmu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdF95UF%2FbtrYDgpFR0X%2FtYbIzKrAY0aZHG4xv0dmu0%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;1147&quot; height=&quot;208&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Web dev/Basic</category>
      <category>spring</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/83</guid>
      <comments>https://a-develop.tistory.com/83#entry83comment</comments>
      <pubDate>Tue, 7 Feb 2023 00:03:42 +0900</pubDate>
    </item>
    <item>
      <title>SPRING 설정 (JAVA Configuration)</title>
      <link>https://a-develop.tistory.com/82</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. SPRING 기본 설정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;SPRING 기본설정 (XML, JAVA공통)&quot; href=&quot;https://a-develop.tistory.com/51&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SPRING 기본설정 (XML, JAVA 공통)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;&lt;b&gt;2.&amp;nbsp;JAVA&amp;nbsp;Configuration&amp;nbsp;설정&amp;nbsp;파일&amp;nbsp;생성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;1)&amp;nbsp;xml설정&amp;nbsp;파일&amp;nbsp;삭제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.1) web.xml과 WEB-INF - spring폴더(servlet-context.xml, root-context.xml) 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.2) pom.xml에 web.xml이 없다는 설정 추가&lt;/p&gt;
&lt;pre id=&quot;code_1675444445278&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-war-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;3.2.0&amp;lt;/version&amp;gt;
                &amp;lt;configuration&amp;gt;
                &amp;lt;failOnMissingWebXml&amp;gt;false&amp;lt;/failOnMissingWebXml&amp;gt;
                &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;2) RootConfig.java 생성&lt;/b&gt; (root-context.xml을 대신함)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 객체(Bean)를 설정하는 파일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Framework가 실행되면 스프링이 사용하는 메모리 영역인 Context를 만들고, ApplicationContext라는 객체가 만들어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root- context의 ComponentScan 파일 위치를 scan하고, @Component가 존재하는 클래스의 인스턴스를 생성한다.&amp;nbsp;&lt;a href=&quot;https://a-develop.tistory.com/84&quot;&gt;SPRING 의존성 주입 설정&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src/main/java - config패키지 생성 - RootConfig.java 클래스 생성&lt;/p&gt;
&lt;pre id=&quot;code_1675431667115&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.toy.config;

import org.springframework.context.annotation.Configuration;

@Configuration
public class RootConfig {

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) &lt;/b&gt;&lt;b&gt;WebConfig.java 생성 및 RootConfig.class 사용 설정 + spring 기본 경로 지정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: WebConfig는 스프링 구동과 관련된 파일이다. (web.xml를 대신함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.1) src/main/java - config - WebConfig.java 생성 - 추상 클래스 AbstractAnnotationConfigDispatcherServletInitializer 상속&lt;/p&gt;
&lt;pre id=&quot;code_1675431774099&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.toy.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class&amp;lt;?&amp;gt;[] getRootConfigClasses() {
// TODO Auto-generated method stub
return null;
}

@Override
protected Class&amp;lt;?&amp;gt;[] getServletConfigClasses() {
// TODO Auto-generated method stub
return null;
}

@Override
protected String[] getServletMappings() {
// TODO Auto-generated method stub
return null;
}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3.2) Root&lt;/span&gt;Config.class 사용 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebConfig.java - getRootConfigClasses() 수정&lt;/p&gt;
&lt;pre id=&quot;code_1675600627194&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Override
protected Class&amp;lt;?&amp;gt;[] getRootConfigClasses() {
return new Class[] {RootConfig.class};
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.3) springMVC 기본 경로 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;WebConfig.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;- getServletMappings() 수정&lt;/p&gt;
&lt;pre id=&quot;code_1675445557360&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@Override
	protected String[] getServletMappings() {
		return new String[] {&quot;/&quot;};
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ 프로젝트 경로 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;server - tomcat 더블클릭 - Modules - edit - path 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4)&lt;/b&gt;&amp;nbsp;&lt;b&gt;ServletConfig.java 생성&lt;/b&gt; (servlet-context.xml을 대신함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 여기서는 @EnableWebMvc와 WebMvcConfigurer 인터페이스를 구현하는 방식을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;src/main/java - config - ServletConfig.java 생성&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675445088391&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.toy.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@EnableWebMvc
@ComponentScan(basePackages = { &quot;com.toy.controller&quot; })
public class ServletConfig implements WebMvcConfigurer {

	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {

		InternalResourceViewResolver bean = new InternalResourceViewResolver();
		bean.setViewClass(JstlView.class);
		bean.setPrefix(&quot;/WEB-INF/views/&quot;);
		bean.setSuffix(&quot;.jsp&quot;);
		registry.viewResolver(bean);
	}

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {

		registry.addResourceHandler(&quot;/resources/**&quot;).addResourceLocations(&quot;/resources/&quot;);
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5)&lt;/b&gt; &lt;b&gt;ServletConfig.class 사용 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;WebConfig.java - getServletMappings() 변경&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675600334715&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@Override
	protected Class&amp;lt;?&amp;gt;[] getServletConfigClasses() {
		return new Class[] {ServletConfig.class};
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 오라클 db 연동&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1. JDBC연결&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) pom.xml에 jdbc 라이브러리 추가&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Oracle&lt;/p&gt;
&lt;pre id=&quot;code_1675589637654&quot; class=&quot;xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.oracle.database.jdbc&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;ojdbc8&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;21.1.0.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL&lt;/p&gt;
&lt;pre id=&quot;code_1675646121311&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- mySQL jdbc연결 --&amp;gt;
&amp;lt;!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;8.0.28&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ JDBC 드라이버를 프로젝트 경로에 포함되도록 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java Build Path - add external library - sqldeveloper - product - lib - ojdbc jar 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java Build Path - add external library - MySQL - Connector J - mysql-connector-j jar 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2 커넥션풀 설정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) pom.xml에 hikari 라이브러리 추가&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675431847908&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.zaxxer&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;HikariCP&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.7.4&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) DataSource설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RootContig.java에 코드 추가&lt;/p&gt;
&lt;pre id=&quot;code_1675431885550&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.toy.config;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
@ComponentScan(basePackages= {&quot;com.toy.sample&quot;})
public class RootConfig {

@Bean
public DataSource dataSource() {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
hikariConfig.setJdbcUrl(&quot;jdbc:oracle:thin:@localhost:1521:XE&quot;);
hikariConfig.setUsername(&quot;book_ex&quot;);
hikariConfig.setPassword(&quot;book_ex&quot;);

HikariDataSource dataSource = new HikariDataSource(hikariConfig);

return dataSource;

}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. mybatis와 스프링 연동&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;b&gt;4.1&amp;nbsp;mybatis&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: SQL mapping Framework이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JDBC의 PreparedStatement를 활용하며 파라미터를 처리하는 '?'는 '#{속성}'을 이용한다.&lt;br /&gt;JDBC 코드의 복잡한 작업을 줄이고 기존의 SQL을 그대로 활용할 수 있어 진입장벽이 낮다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) mybatis 관련 라이브러리 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675431958555&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;mybatis&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;3.4.6&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;mybatis-spring&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.3.2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;!-- https://mvnrepository.com/artifact/org.springframework/spring-tx --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-tx&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;2) SQLSessionFactory 설정&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 내부적으로 SQLSession을 만들어내고 이를 통해 Connection을 생성하거나 SQL을 전달하고 결과를 리턴 받는 구조로 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;RootConfig.java에 추가&lt;/p&gt;
&lt;pre id=&quot;code_1675431978802&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource());
return (SqlSessionFactory) sqlSessionFactory.getObject();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2 스프링 연동&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: SQLSessionFactory로 직접 JDBC코딩이 가능하지만, MyBatis의 Mapper를 통해 SQL을 설정하고 자동으로 처리되도록 하는 방식이 더 편리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;: Mapper interface(@Select(&quot;쿼리문&quot;))만 사용하는 방법과 Mapper interface(메소드선언)+XML(쿼리문작성)을 함께 쓰는 방법이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;1) Mapper 인터페이스만 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;src/main/java - mapper 패키지 생성 - 인터페이스 생성 - 어노테이션 및 쿼리문 작성&lt;/p&gt;
&lt;pre id=&quot;code_1675432017260&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.toy.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {

@Select(&quot;SELECT sysdate FROM dual&quot;)
public String getTime();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt; Mapper인식 설정&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: Mybatis가 동작할 때 자동으로 해당 패키지를 인식해 Mapper를 인식하도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;RootConfig.java에 @MapperScan 추가&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1675432034107&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
@ComponentScan(basePackages= {&quot;com.toy.sample&quot;})
@MapperScan(basePackages= {&quot;com.toy.mapper&quot;})
public class RootConfig {&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;2) Mapper 인터페이스와 XML 매퍼 같이 쓰기&lt;/b&gt; &lt;br /&gt;: SQL이 복잡할 경우 어노테이션보다 XML을 이용하는 방식이 선호된다. &lt;br /&gt;: Mapper 인터페이스에 메소드를 선언하고, XML에서 SQL을 처리한다. &lt;br /&gt;&lt;br /&gt;2.1) Mapper 인터페이스 - 메소드 선언&lt;/p&gt;
&lt;pre id=&quot;code_1675432113651&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.toy.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {

public String getTime2();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;2.2) XML - SQL처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: myBatis 태그를 추가하고 &amp;lt;mapper&amp;gt;태그 내에 sql문을 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: Mapper인터페이스와 동일한 이름의 namespace가 존재하면 둘을 병합처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;Mapper 인터페이스가 위치한 곳 또는 src/main/resources - 인터페이스 폴더명 생성&lt;span style=&quot;color: #555555;&quot;&gt;(상위 폴더부터 각각 만들기. com폴더 -&amp;gt; toy폴더 -&amp;gt; mapper폴더)&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- XML파일 생성 -&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;myBatis 태그를 추가 - &amp;lt;mapper&amp;gt; 태그안에 sql문 작성&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675432127860&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;!DOCTYPE mapper
PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt; 
&amp;lt;mapper namespace=&quot;com.toy.mapper.TimeMapper&quot;&amp;gt; 
&amp;lt;select id=&quot;getTime2&quot; resultType=&quot;string&quot;&amp;gt;
SELECT sysdate FROM dual
&amp;lt;/select&amp;gt;
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;4) log4jdbc-log4j2 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: JDBC의 PreparedStatement에 사용된 '?'가 어떤 값으로 처리됐는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 쿼리를 더 자세하게 SQL log로 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;4.1) pom.xml에 라이브러리 추가&lt;/p&gt;
&lt;pre id=&quot;code_1675432211627&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 --&amp;gt; 
&amp;lt;dependency&amp;gt; 
&amp;lt;groupId&amp;gt;org.bgee.log4jdbc-log4j2&amp;lt;/groupId&amp;gt; 
&amp;lt;artifactId&amp;gt;log4jdbc-log4j2-jdbc4&amp;lt;/artifactId&amp;gt; 
&amp;lt;version&amp;gt;1.16&amp;lt;/version&amp;gt; 
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;4.2) 로그 설정 파일 추가 &lt;br /&gt;src/main/resources&amp;nbsp;-&amp;nbsp;log4jdbc.log4j2.properties&amp;nbsp;생성&lt;/p&gt;
&lt;pre id=&quot;code_1675432222723&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;4.3) JDBC연결 정보 수정 (JDBC드라이버와 URL 변경)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;RootConfig.java 수정&amp;nbsp; - oracle&lt;/p&gt;
&lt;pre id=&quot;code_1675432282307&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@Bean
	public DataSource dataSource() {
		HikariConfig hikariConfig = new HikariConfig();
//		hikariConfig.setDriverClassName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
//		hikariConfig.setJdbcUrl(&quot;jdbc:oracle:thin:@localhost:1521:XE&quot;);
		hikariConfig.setDriverClassName(&quot;net.sf.log4jdbc.sql.jdbcapi.DriverSpy&quot;);
		hikariConfig.setJdbcUrl(&quot;jdbc:log4jdbc:oracle:thin:@localhost:1521:XE&quot;);
		hikariConfig.setUsername(&quot;book_ex&quot;);
		hikariConfig.setPassword(&quot;book_ex&quot;);
		
		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
		
		return dataSource;
		
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RootConfig.java 수정&amp;nbsp; - MySQL&lt;/p&gt;
&lt;pre id=&quot;code_1675644320742&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@Bean
	public DataSource dataSource() {
		HikariConfig hikariConfig = new HikariConfig();
		hikariConfig.setDriverClassName(&quot;net.sf.log4jdbc.sql.jdbcapi.DriverSpy&quot;);
		hikariConfig.setJdbcUrl(&quot;jdbc:log4jdbc:mysql://127.0.0.1:3306/toy&quot;);
		hikariConfig.setUsername(&quot;toy&quot;);
		hikariConfig.setPassword(&quot;toy&quot;);
		
		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
		
		return dataSource;
		
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.4) 로그 경로 및 레벨 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src/test/resources -&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;log4j.xml&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675651142084&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;!-- Application Loggers --&amp;gt;
	&amp;lt;logger name=&quot;com.toy&quot;&amp;gt;
		&amp;lt;level value=&quot;info&quot; /&amp;gt;
	&amp;lt;/logger&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 추가&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;+ UTF-8 필터 (&lt;span&gt;브라우저 한글 문제 발생 시)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: WebConfig.java에 추가&lt;/p&gt;
&lt;pre id=&quot;code_1675603240313&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import javax.servlet.Filter;

@Override
	protected Filter[] getServletFilters() {
		CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
		encodingFilter.setEncoding(&quot;UTF-8&quot;);
		return new Filter[] {encodingFilter};
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;+ 파일 업로드 commons-fileupload라이브러리 (servlet2.5)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(servlet3.0, tomcat7.0이상은 필요X)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;1) pom.xml에 dependency 추가&lt;/p&gt;
&lt;pre id=&quot;code_1675822771419&quot; class=&quot;xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;commons-fileupload&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;commons-fileupload&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.3.3&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) ServletConfig.java에 코드 추가&lt;/p&gt;
&lt;pre id=&quot;code_1675822771424&quot; class=&quot;reasonml&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Bean(name=&quot;multipartResolver&quot;)
	public CommonsMultipartResolver getResolver() throws Exception{
		CommonsMultipartResolver resolver = new CommonsMultipartResolver();
		
		// 10MB
		resolver.setMaxUploadSize(1024*1024*10);
        
		// 2MB
		resolver.setMaxUploadSizePerFile(1024*1024*2);
        
		// 1MB
		resolver.setMaxInMemorySize(1024*1024);
		
		// temp upload
		resolver.setUploadTempDir(new FileSystemResource(&quot;C:\\upload\\temp&quot;));
        
		resolver.setDefaultEncoding(&quot;UTF-8&quot;);
		
		return resolver;
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;pre id=&quot;code_1675822809012&quot; class=&quot;pgsql&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/exUploadForm&quot;)
	public void exUploadForm() {
		log.info(&quot;/exUpload...&quot;);
	}
	
    //name = files로 여러 파일을 다중 업로드했기때문에 MultipartFile타입 배열로 처리한다. 
    //예시에는 없지만 추가로 byte[]처리를 해야 업로드가 완료된다
	@GetMapping(&quot;exUploadPost&quot;)
	public void exUploadPost(ArrayList&amp;lt;MultipartFile&amp;gt; files) {
		
		files.forEach(file -&amp;gt; {
			log.info(&quot;--&quot;);
			log.info(&quot;name:&quot; + file.getOriginalFilename());
			log.info(&quot;size:&quot; + file.getSize());
		});
	}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web dev/Basic</category>
      <category>spring</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/82</guid>
      <comments>https://a-develop.tistory.com/82#entry82comment</comments>
      <pubDate>Mon, 6 Feb 2023 00:01:41 +0900</pubDate>
    </item>
    <item>
      <title>오류 Log4j - org.apache.log4j.Logger cannot be resolved to a type</title>
      <link>https://a-develop.tistory.com/81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pom.xml의 log4j라이브러리 &amp;lt;scope&amp;gt; runtime을 주석처리 한다.&lt;!--  &lt;scope&gt;runtime&lt;/scope&gt; --&gt;&lt;!--  &lt;scope&gt;runtime&lt;/scope&gt; --&gt;&lt;!--  &lt;scope&gt;runtime&lt;/scope&gt; --&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--  &lt;scope&gt;runtime&lt;/scope&gt; --&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1675397812976&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;

&amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.2.17&amp;lt;/version&amp;gt;
&amp;lt;!--  &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; --&amp;gt;

&amp;lt;/dependency&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;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;Maven Dependency Scope&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;: compile, provided, runtime, test, system, import의 6개 scope가 존재한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;: dependency의 이행을 제한하고 언제 classpath에 포함될지를 결정한다.&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;runtime&lt;/b&gt;&lt;br /&gt;This scope indicates that the dependency is not required for compilation, but is for execution. Maven includes a dependency with this scope in the runtime and test classpaths, but not the compile classpath.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;출처&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope&quot;&gt;Maven &amp;ndash; Introduction to the Dependency Mechanism (apache.org)&lt;/a&gt;&lt;/p&gt;</description>
      <category>Web dev/Error</category>
      <category>error</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/81</guid>
      <comments>https://a-develop.tistory.com/81#entry81comment</comments>
      <pubDate>Sun, 5 Feb 2023 00:01:18 +0900</pubDate>
    </item>
    <item>
      <title>SPRING 설정 (XML)</title>
      <link>https://a-develop.tistory.com/80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. SPRING 기본 설정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://a-develop.tistory.com/51&quot;&gt;SPRING 기본설정 (XML, JAVA 공통)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 오라클 db 연동&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 오라클과 SQLDeveloper를 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;b&gt;2.1. JDBC연결&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) pom.xml에 오라클jdbc 라이브러리 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675391150833&quot; class=&quot;xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.oracle.database.jdbc&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;ojdbc8&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;21.1.0.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ JDBC 드라이버를 프로젝트 경로에 포함되도록 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java Build Path - add external library - sql developer - product - lib - ojdbc jar 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.2. 커넥션풀 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) pom.xml에 &lt;b&gt;HikariCP &lt;/b&gt;라이브러리 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675391150836&quot; class=&quot;xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.zaxxer&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;HikariCP&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.7.4&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;2) DataSource 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root-contect.xml에 아래 코드 추가&lt;/p&gt;
&lt;pre id=&quot;code_1675391150837&quot; class=&quot;applescript&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;bean id=&quot;hikariConfig&quot; class=&quot;com.zaxxer.hikari.HikariConfig&quot;&amp;gt;
&amp;lt;property name=&quot;driverClassName&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;&amp;gt;&amp;lt;/property&amp;gt;
&amp;lt;property name=&quot;jdbcUrl&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:XE&quot;&amp;gt;&amp;lt;/property&amp;gt;
&amp;lt;property name=&quot;username&quot; value=&quot;book_ex&quot;&amp;gt;&amp;lt;/property&amp;gt;
&amp;lt;property name=&quot;password&quot; value=&quot;book_ex&quot;&amp;gt;&amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1675391150839&quot; class=&quot;xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- HikariCP configuration --&amp;gt;
&amp;lt;bean id=&quot;dataSource&quot; class=&quot;com.zaxxer.hikari.HikariDataSource&quot; destroy-method=&quot;close&quot;&amp;gt;
&amp;lt;constructor-arg ref=&quot;hikariConfig&quot; /&amp;gt;
&amp;lt;/bean&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. mybatis와 스프링 연동&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1. mybatis&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: SQL mapping 프레임워크이다. (ORM Framework)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 SQL을 그대로 활용할 수 있고, 진입장벽이 낮다. JDBC 코드의 복잡한 작업을 줄인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;1) pom.xml에 라이브러리 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675391150841&quot; class=&quot;dust&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;mybatis&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;3.4.6&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;mybatis-spring&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.3.2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-tx&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) SQLSessionFactory&amp;nbsp;설정&amp;nbsp;&lt;/b&gt; &lt;br /&gt;:&amp;nbsp;내부적으로&amp;nbsp;SQLSession을&amp;nbsp;만들어내고&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;Connection을&amp;nbsp;생성하거나&amp;nbsp;SQL을&amp;nbsp;전달하고&amp;nbsp;결과를&amp;nbsp;리턴&amp;nbsp;받는&amp;nbsp;구조로&amp;nbsp;작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root-context.xm에 SqlSessionFactory 등록&lt;/p&gt;
&lt;pre id=&quot;code_1675391150844&quot; class=&quot;applescript&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;bean id=&quot;sqlSessionFactory&quot; class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&amp;gt;
    &amp;lt;property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&amp;gt;&amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2. 스프링 연동&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: MyBatis의 Mapper는 SQL과 그에 대한 처리를 지정한다.&lt;br /&gt;: Mapper interface(@Select(&quot;쿼리문&quot;))만 사용하는 방법과 Mapper interface(메소드선언)+XML(쿼리문작성)을 함께 쓰는 방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1)&amp;nbsp; Mapper 인터페이스만 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src/main/java - mapper 패키지 생성 - 인터페이스 생성 - 어노테이션 및 쿼리문 작성&lt;/p&gt;
&lt;pre id=&quot;code_1675589015989&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.toy.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {

@Select(&quot;SELECT sysdate FROM dual&quot;)
public String getTime();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Mapper 인식 설정&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;Mybatis가 동작할 때 자동으로 해당 패키지를 인식해 Mapper를 인식하도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root-context.xml -&amp;gt; Namespaces탭 -&amp;gt; beans, context, mybatis-spring 체크 -&amp;gt; root-context.xml에 아래 코드 추가&lt;/p&gt;
&lt;pre id=&quot;code_1675391150845&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;mybatis-spring:scan base-package=&quot;org.zerock.mapper&quot;/&amp;gt;

&amp;lt;!-- &amp;lt;mybatis-spring:scan&amp;gt;태그 base-pakage속성 : 해당 패키지의 모든 Mybatis 관련 어노테이션 처리 --&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Mapper 인터페이스와 XML 매퍼와 같이 쓰기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: SQL이 복잡할 경우 어노테이션보다 XML을 이용하는 방식이 선호된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: Mapper 인터페이스에 메소드를 선언하고, XML에서 SQL을 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.1) Mapper 인터페이스 - 메소드 선언&lt;/p&gt;
&lt;pre id=&quot;code_1675588786497&quot; class=&quot;routeros&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.toy.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {

public String getTime2();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;2.2) XML - SQL처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;: Mapper 인터페이스의 이름과 XML의 &amp;lt;mapper&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;태그 namespace 속성값이 같아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mapper인터페이스와 동일한 이름의 namespace가 존재하면 둘을 병합처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;Mapper 인터페이스가 위치한 곳 또는 src/main/resources - 인터페이스 폴더명 생성&lt;span style=&quot;color: #555555;&quot;&gt;(상위 폴더부터 각각 만들기. com폴더 -&amp;gt; toy폴더 -&amp;gt; mapper폴더)&lt;/span&gt; - XML파일 생성 -&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;myBatis 태그를 추가 - &amp;lt;mapper&amp;gt; 태그안에 sql문 작성&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675588786499&quot; class=&quot;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;!DOCTYPE mapper
PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt; 
&amp;lt;mapper namespace=&quot;com.toy.mapper.TimeMapper&quot;&amp;gt; 
&amp;lt;select id=&quot;getTime2&quot; resultType=&quot;string&quot;&amp;gt;
SELECT sysdate FROM dual
&amp;lt;/select&amp;gt;
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) log4jdbc-log4j2 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: JDBC의&amp;nbsp;PreparedStatement에&amp;nbsp;사용된&amp;nbsp;'?'가&amp;nbsp;어떤&amp;nbsp;값으로&amp;nbsp;처리됐는지&amp;nbsp;확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리를 더 자세하게 SQL log로 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;3.1) pom.xml에 라이브러리 추가&lt;/p&gt;
&lt;pre id=&quot;code_1675391150846&quot; class=&quot;xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 --&amp;gt; 
&amp;lt;dependency&amp;gt; 
&amp;lt;groupId&amp;gt;org.bgee.log4jdbc-log4j2&amp;lt;/groupId&amp;gt; 
&amp;lt;artifactId&amp;gt;log4jdbc-log4j2-jdbc4&amp;lt;/artifactId&amp;gt; 
&amp;lt;version&amp;gt;1.16&amp;lt;/version&amp;gt; 
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;3.2) log4jdbc.log4j2.properties (src/main/resources 아래에 추가)&lt;/p&gt;
&lt;pre id=&quot;code_1675391150847&quot; class=&quot;stylus&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.3) root-context.xml의 hikariConfig 수정 (JDBC드라이버와 URL 변경)&lt;/p&gt;
&lt;pre id=&quot;code_1675391150848&quot; class=&quot;routeros&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;bean id=&quot;hikariConfig&quot; class=&quot;com.zaxxer.hikari.HikariConfig&quot;&amp;gt;

&amp;lt;property name=&quot;driverClassName&quot; value=&quot;net.sf.log4jdbc.sql.jdbcapi.DriverSpy&quot;&amp;gt;&amp;lt;/property&amp;gt;
&amp;lt;property name=&quot;jdbcUrl&quot; value=&quot;jdbc:log4jdbc:oracle:thin:@localhost:1521:XE&quot;&amp;gt;&amp;lt;/property&amp;gt;

&amp;lt;property name=&quot;username&quot; value=&quot;book_ex&quot;&amp;gt;&amp;lt;/property&amp;gt;
&amp;lt;property name=&quot;password&quot; value=&quot;book_ex&quot;&amp;gt;&amp;lt;/property&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.4) 로그 경로 및 레벨 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src/test/resources -&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;log4j.xml&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675651453084&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;!-- Application Loggers --&amp;gt;
	&amp;lt;logger name=&quot;com.toy&quot;&amp;gt;
		&amp;lt;level value=&quot;info&quot; /&amp;gt;
	&amp;lt;/logger&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 추가&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;+ UTF-8 필터 (&lt;span&gt;브라우저 한글 문제 발생 시)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: web.xml에 &amp;lt;filter&amp;gt; 추가&lt;/p&gt;
&lt;pre id=&quot;code_1675603083766&quot; class=&quot;pgsql&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  &amp;lt;filter&amp;gt;
        &amp;lt;filter-name&amp;gt;encoding&amp;lt;/filter-name&amp;gt;
        &amp;lt;filter-class&amp;gt;
            org.springframework.web.filter.CharacterEncodingFilter
        &amp;lt;/filter-class&amp;gt;
        &amp;lt;init-param&amp;gt;
            &amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;
            &amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;
        &amp;lt;/init-param&amp;gt;
    &amp;lt;/filter&amp;gt;
    
    &amp;lt;filter-mapping&amp;gt;
      &amp;lt;filter-name&amp;gt;encoding&amp;lt;/filter-name&amp;gt;
      &amp;lt;servlet-name&amp;gt;appServlet&amp;lt;/servlet-name&amp;gt;
    &amp;lt;/filter-mapping&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;+ 파일 업로드 commons-fileupload라이브러리 (servlet2.5)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(servlet3.0, tomcat7.0이상은 필요X)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;1) pom.xml에 dependency 추가&lt;/p&gt;
&lt;pre id=&quot;code_1675822750642&quot; class=&quot;xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;commons-fileupload&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;commons-fileupload&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.3.3&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;2) servlet-context.xml 설정 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(id값 multipartResolver, 인코딩, 업로드 크기, 파일 크기, 파일 업로드될 경로,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;메모리상 최대 크기&lt;/span&gt;&amp;nbsp;설정)&lt;/p&gt;
&lt;pre id=&quot;code_1675822750644&quot; class=&quot;javascript&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;beans:bean id=&quot;multipartResolver&quot; class=&quot;org.springframework.web.multipart.commons.CommonsMultipartResolver&quot;&amp;gt;
  &amp;lt;beans:property name=&quot;defaultEncoding&quot; value=&quot;utf-8&quot;&amp;gt;&amp;lt;/beans:property&amp;gt;
  &amp;lt;!-- 1024 * 1024 * 10 bytes 10MB --&amp;gt;
  &amp;lt;beans:property name=&quot;maxUploadSize&quot; value=&quot;104857560&quot;&amp;gt;&amp;lt;/beans:property&amp;gt;
  &amp;lt;!-- 1024 * 1024 * 2 bytes 2MB --&amp;gt;
  &amp;lt;beans:property name=&quot;maxUploadSizePerFile&quot; value=&quot;2097152&quot;&amp;gt;&amp;lt;/beans:property&amp;gt;
  &amp;lt;beans:property name=&quot;uploadTempDir&quot; value=&quot;file:/C:/upload/tmp&quot;&amp;gt;&amp;lt;/beans:property&amp;gt;
  &amp;lt;beans:property name=&quot;maxInMemorySize&quot; value=&quot;10485756&quot;&amp;gt;&amp;lt;/beans:property&amp;gt;
&amp;lt;/beans:bean&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;pre id=&quot;code_1675822750647&quot; class=&quot;pgsql&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/exUploadForm&quot;)
	public void exUploadForm() {
		log.info(&quot;/exUpload...&quot;);
	}
	
    //name = files로 여러 파일을 다중 업로드했기때문에 MultipartFile타입 배열로 처리한다. 
    //예시에는 없지만 추가로 byte[]처리를 해야 업로드가 완료된다
	@GetMapping(&quot;exUploadPost&quot;)
	public void exUploadPost(ArrayList&amp;lt;MultipartFile&amp;gt; files) {
		
		files.forEach(file -&amp;gt; {
			log.info(&quot;--&quot;);
			log.info(&quot;name:&quot; + file.getOriginalFilename());
			log.info(&quot;size:&quot; + file.getSize());
		});
	}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web dev/Basic</category>
      <category>spring</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/80</guid>
      <comments>https://a-develop.tistory.com/80#entry80comment</comments>
      <pubDate>Sat, 4 Feb 2023 00:01:05 +0900</pubDate>
    </item>
    <item>
      <title>Visual Studio Code(vscode) 단축키</title>
      <link>https://a-develop.tistory.com/79</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;! + enter&lt;/b&gt; : html파일 기본양식 자동생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;태그명 :&lt;/b&gt; 해당 태그 도움말 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 태그명.클래스명&lt;/b&gt; : 해당 태그와 클래스명 생성 (div는 클래스명 생략 가능)&lt;br /&gt;&lt;b&gt;input#입력내용&lt;/b&gt;&amp;nbsp;:&amp;nbsp;input태그와&amp;nbsp;id&amp;nbsp;생성 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ctrl+enter&lt;/b&gt;&amp;nbsp;:&amp;nbsp;현재&amp;nbsp;줄&amp;nbsp;아래에&amp;nbsp;빈줄&amp;nbsp;생성 &lt;br /&gt;&lt;b&gt;ctrl + shift + enter&lt;/b&gt; : 현재 줄 위에 빈줄 생성 &lt;br /&gt;&lt;b&gt;ctrl + /&lt;/b&gt; : (현재 줄) 주석 &lt;br /&gt;&lt;b&gt;shift + alt+f&lt;/b&gt;&amp;nbsp;:&amp;nbsp;자동정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;글&amp;nbsp;사이에&amp;nbsp;&amp;nbsp;span&amp;nbsp;태그&lt;/b&gt; 사용하기 : 글자&amp;nbsp;양쪽&amp;nbsp;띄우고&amp;nbsp;span적어야&amp;nbsp;도움말&amp;nbsp;클릭&amp;nbsp;가능(or&amp;nbsp;tab&amp;nbsp;사용&amp;nbsp;가능)&amp;nbsp;&lt;/p&gt;</description>
      <category>Web dev</category>
      <category>HTML CSS</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/79</guid>
      <comments>https://a-develop.tistory.com/79#entry79comment</comments>
      <pubDate>Fri, 3 Feb 2023 00:01:50 +0900</pubDate>
    </item>
    <item>
      <title>카카오 오븐 협업 방법</title>
      <link>https://a-develop.tistory.com/77</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 프로젝트 공유&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 프로젝트 -&amp;gt; 공유옵션 -&amp;gt; 공유할 멤버 이메일 입력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;카카오 오븐 협업1.png&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMdzDM/btrXJflnfl8/9JuhIVbz2U8mljGFCFaXb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMdzDM/btrXJflnfl8/9JuhIVbz2U8mljGFCFaXb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMdzDM/btrXJflnfl8/9JuhIVbz2U8mljGFCFaXb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMdzDM%2FbtrXJflnfl8%2F9JuhIVbz2U8mljGFCFaXb0%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;1270&quot; height=&quot;199&quot; data-filename=&quot;카카오 오븐 협업1.png&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 2. 프로젝트 합치기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 나에게 공유된 프로젝트 -&amp;gt; 해당 프로젝트에서 복사할 페이지에 들어가서 전체를 드래그한다. &lt;br /&gt;2) 드래그한 것 우클릭 후 그룹 클릭 -&amp;gt; 그룹화한 것 우클릭 후 보내기 보관함 -&amp;gt; 화면 우측 보관함에서 확인 가능 &lt;br /&gt;3) 내&amp;nbsp; 프로젝트 -&amp;gt; 붙여넣을 프로젝트 클릭 -&amp;gt; 화면 우측 보관함에서 원하는 파일 드래그해서 붙여넣기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스토리보드 협업 .png&quot; data-origin-width=&quot;1729&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P9kk4/btrXJ1NVEAh/i0bpdkh0ZcRhBjMEyBW3wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P9kk4/btrXJ1NVEAh/i0bpdkh0ZcRhBjMEyBW3wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P9kk4/btrXJ1NVEAh/i0bpdkh0ZcRhBjMEyBW3wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP9kk4%2FbtrXJ1NVEAh%2Fi0bpdkh0ZcRhBjMEyBW3wk%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;1729&quot; height=&quot;541&quot; data-filename=&quot;스토리보드 협업 .png&quot; data-origin-width=&quot;1729&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>etc</category>
      <category>카카오오븐</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/77</guid>
      <comments>https://a-develop.tistory.com/77#entry77comment</comments>
      <pubDate>Wed, 1 Feb 2023 12:04:03 +0900</pubDate>
    </item>
    <item>
      <title>HTML CSS 이중 스크롤바 없애기</title>
      <link>https://a-develop.tistory.com/76</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;상황&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쇼핑몰 프로젝트 작업 중 상품목록 페이지에 스크롤바가 두개 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;상품목록을 테이블로 만들었는데, 테이블이 중간에 끊겨서 끝번호 상품까지 보이지 않았다. 대신 테이블 안에 스크롤바가 하나 더 생겨서 그 스크롤바를 내리면 끝까지 볼 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 부분 &amp;lt;div&amp;gt;의 높이가 상품리스트 전체를 보여주기에 충분하지 않기 때문에 스크롤이 하나 더 생기는 것이다. &lt;br /&gt;&amp;lt;div&amp;gt;의 높이 값을 100%로 설정하니 리스트가 전부 다 보이고 이중 스크롤바도 사라졌다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex)&lt;/b&gt; style=&quot;height: 100%;&quot;&lt;/p&gt;</description>
      <category>Web dev</category>
      <category>HTML CSS</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/76</guid>
      <comments>https://a-develop.tistory.com/76#entry76comment</comments>
      <pubDate>Mon, 30 Jan 2023 01:35:27 +0900</pubDate>
    </item>
    <item>
      <title>commandMap에서 int 값 꺼내기 (Object -&amp;gt; int)</title>
      <link>https://a-develop.tistory.com/75</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;상황&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;commandMap에서 number타입 값을 꺼내고 강제 형변환을 시켰더니 &quot;cannot be cast to java.lang.Integer&quot; 오류가 발생했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;br /&gt;int itemid = (int) commandMap.get(&quot;ITEM_ID&quot;); - (x)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&lt;/b&gt; 먼저 String.valueOf를 사용해서 Object타입을 String 타입으로 변환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;commandMap.get(&quot;키 값&quot;);은 Object 타입이다.&lt;/p&gt;
&lt;pre id=&quot;code_1674842792811&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; public Object get(String key){
        return map.get(key);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&lt;/b&gt; 그 다음은 &lt;a title=&quot;request에서 int값을 가져오는 방법&quot; href=&quot;https://a-develop.tistory.com/74&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;request에서 int값을 가져오는 방법&lt;/a&gt;과 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;br /&gt;int itemid = Integer.parseInt(String.valueOf(commandMap.get(&quot;ITEM_ID&quot;))); - (o)&lt;/p&gt;</description>
      <category>Web dev</category>
      <category>java</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/75</guid>
      <comments>https://a-develop.tistory.com/75#entry75comment</comments>
      <pubDate>Sun, 29 Jan 2023 00:01:47 +0900</pubDate>
    </item>
    <item>
      <title>request에서 int 값 꺼내기(String-&amp;gt;int)</title>
      <link>https://a-develop.tistory.com/74</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;: request.getParameter는 항상 String값을 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 number타입을 꺼내올 시 형변환이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Integer.pareInt() 사용하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;pre id=&quot;code_1674795546283&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int id = Integer.parseInt(request.getParameter(&quot;IDX&quot;));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Web dev</category>
      <category>java</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/74</guid>
      <comments>https://a-develop.tistory.com/74#entry74comment</comments>
      <pubDate>Sat, 28 Jan 2023 00:03:07 +0900</pubDate>
    </item>
    <item>
      <title>$(document).ready(function() / $(function()</title>
      <link>https://a-develop.tistory.com/73</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;: 문서가 준비되면 중괄호{ } 안의 내용을 실행하라. (여러개 O)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674795215925&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
$(document).ready(function(){
});

$(document).ready(function(){
});
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1674795263035&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
$(function(){
});
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web dev</category>
      <category>javascript jquery</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/73</guid>
      <comments>https://a-develop.tistory.com/73#entry73comment</comments>
      <pubDate>Fri, 27 Jan 2023 13:57:16 +0900</pubDate>
    </item>
    <item>
      <title>JAVA Math.ceil() 사용 시 주의사항</title>
      <link>https://a-develop.tistory.com/72</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;상황&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시판 페이징을 구현하던 중에 Math.ceil이 적용되지 않는 문제가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int totalPage = (int) Math.ceil(totalItem/itemPerPage); - (x)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Math.ceil함수 안에서 연산을 하면 정수값이 도출돼서 Math.ceil이 적용되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 double타입으로 강제타입변환을 하거나 1.0을 곱해서 소수점이 있는 실수로 만들어줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int totalPage = (int) Math.ceil(totalItem&lt;b&gt;*1.0&lt;/b&gt;/itemPerPage); - (o)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int totalPage = (int) Math.ceil(&lt;b&gt;(double)&lt;/b&gt;totalItem/itemPerPage); &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- (o)&lt;/span&gt;&lt;/p&gt;</description>
      <category>Web dev</category>
      <category>java</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/72</guid>
      <comments>https://a-develop.tistory.com/72#entry72comment</comments>
      <pubDate>Thu, 26 Jan 2023 16:46:37 +0900</pubDate>
    </item>
    <item>
      <title>ORACLE MYSQL 더미데이터  (dummy data) 생성 방법</title>
      <link>https://a-develop.tistory.com/71</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 재귀복사 - 2배씩 늘리기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Oracle&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674119390842&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;insert into tbl_board (bno, title, content)
(select seq_board.nextval, title, content from tbl_board);

commit;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MySQL&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675834428917&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;insert into boards(boardtitle, boardcontent, boardwriter)(select boardtitle, boardcontent, boardwriter from boards);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 프로시저 반복문 활용하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Oracle&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674119403162&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BEGIN
    FOR i IN 1..500 LOOP
    INSERT INTO TB_BOARD(IDX, TITLE, HIT_CNT, DEL_GB, CREA_DTM, CREA_ID) 
    VALUES(SEQ_TB_BOARD_IDX.NEXTVAL, '제목 '||i, 0, 'N', SYSDATE, 'Admin');
    END LOOP;
END;

commit;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MySQL&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675834458125&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DELIMITER $$

DROP PROCEDURE IF EXISTS loopInsert$$

CREATE PROCEDURE loopInsert()
BEGIN
    DECLARE i INT DEFAULT 1;
        
    WHILE i &amp;lt;= 500 DO
        INSERT INTO boards(boardtitle, boardcontent, boardwriter)
          VALUES(concat('제목',i), concat('내용',i), concat('작성자',i));
        SET i = i + 1;
    END WHILE;
END$$

DELIMITER $$

CALL loopInsert;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web dev</category>
      <category>db</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/71</guid>
      <comments>https://a-develop.tistory.com/71#entry71comment</comments>
      <pubDate>Sun, 22 Jan 2023 00:01:41 +0900</pubDate>
    </item>
    <item>
      <title>오류 class java.lang.String cannot be cast to class</title>
      <link>https://a-develop.tistory.com/70</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[상황]&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;form 태그에서 name값이 동일한 &lt;span&gt;&amp;lt;input type = hidden&amp;gt;이 &lt;/span&gt;2개 있다. &lt;br /&gt;submit으로 이 name값을 보내줄때 상황에 따라 아예 보내지 않거나 1개 또는 2개를 보내도록 설정했다. &lt;br /&gt;service단에서 위 값을 string[] 배열로 받도록 설정했더니 2개를 보냈을 때는 잘 받아지는데, 보내지 않거나 1개를 보낼 시 아래 오류가 떴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[오류]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request processing failed; nested exception is java.lang.ClassCastException: class java.lang.String cannot be cast to class [Ljava.lang.String; (java.lang.String and [Ljava.lang.String; are in module java.base of loader 'bootstrap') &lt;br /&gt;&lt;br /&gt;java.lang.ClassCastException: class java.lang.String cannot be cast to class [Ljava.lang.String; (java.lang.String and [Ljava.lang.String; are in module java.base of loader 'bootstrap')&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[해결]&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무것도 보내지 않거나 1개를 보낼 시 string[] 배열로 받을 수 없기 때문에 오류가 뜨는 것 같았다. &lt;br /&gt;그래서&amp;nbsp;service단에서&amp;nbsp;무조건 &lt;span&gt;string[]&lt;/span&gt;배열로 받는 게 아니라 상황을 3가지로 나누고 if문을 사용해서 조건을 줬다. &lt;br /&gt;if&amp;nbsp;-&amp;nbsp;넘어오는&amp;nbsp;값이&amp;nbsp;없을&amp;nbsp;때&amp;nbsp;(값&amp;nbsp;0개) &lt;br /&gt;else&amp;nbsp;-&amp;nbsp;값이&amp;nbsp;배열로&amp;nbsp;넘어&amp;nbsp;올&amp;nbsp;때&amp;nbsp;(값&amp;nbsp;2개) &lt;br /&gt;else&amp;nbsp;-&amp;nbsp;값이&amp;nbsp;배열로&amp;nbsp;넘어오지&amp;nbsp;않을&amp;nbsp;때&amp;nbsp;(값&amp;nbsp;1개) &lt;br /&gt;이 중 값이 2개가 넘어올때만 값을 배열 string[]으로 받도록 설정하니 해결됐다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Web dev/Error</category>
      <category>error</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/70</guid>
      <comments>https://a-develop.tistory.com/70#entry70comment</comments>
      <pubDate>Sat, 21 Jan 2023 00:01:53 +0900</pubDate>
    </item>
    <item>
      <title>ORACLE JSP에서 날짜 출력 시 포맷 변경하는 법</title>
      <link>https://a-develop.tistory.com/69</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오라클 SQL SELECT문을 사용해서 년.월.일만 출력하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. TO_DATE (X)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TO_DATE를 사용하면 시.분.초가 없어지지 않고 0으로 나온다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) TO_DATE(컬럼명,'YYYY.MM.DD')&amp;nbsp; =&amp;gt; 2023.01.18 00:00:00.0&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. TO_CHAR (O)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) TO_CHAR(컬럼명,'YYYY.MM.DD')&amp;nbsp; =&amp;gt; 2023.01.18&lt;/p&gt;</description>
      <category>Web dev</category>
      <category>db</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/69</guid>
      <comments>https://a-develop.tistory.com/69#entry69comment</comments>
      <pubDate>Fri, 20 Jan 2023 00:01:02 +0900</pubDate>
    </item>
    <item>
      <title>모두를 위한 컴퓨터 과학 CS50 (컴퓨팅 사고)</title>
      <link>https://a-develop.tistory.com/68</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CS&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 해결 과정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input -&amp;gt; cs -&amp;gt; output&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2진법 (&lt;b&gt;binary system)&lt;/b&gt;과 정보의 표현&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;bit = binary digit &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 2진법에서 하나의 자릿수를 표현하는 단위.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0과 1 두가지 값만 가질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;bit string&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bit 한 개론 많은 양의 데이터를 나타내기에 부족해서 여러 숫자 조합을 컴퓨터에 나타내기 위해 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;byte = 8bit / 2^8 = two to the eight(256개)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kilobyte=1000byte&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;megabyte=1000kilobyte&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gigabyte=1000megabyte&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;terabyte=1000gigabyte&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;transistor&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터 속 작은 스위치들을 물리적으로 이용해서 정보를 표현하고 값을 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ASCII&lt;/b&gt;(American AStandard Code for Information Interchange 미국 정보 교환용 표준 부호)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자를 숫자로 표현할 수 있도록 정해진 약속 / 128개 부호&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Unicode&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이모티콘 까지 표현 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;픽셀의 RGB코드 (red, green, blue)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 가지 색을 서로 다른 비율로 조합한 픽셀, 이 숫자들을 표현하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 해결하는 단계적인 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input -&amp;gt; algorithoms.. -&amp;gt; output&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력값을 출력값의 형태로 바꾸기 위해 어떤 명령들이 수행되어야 하는지에 대한 규칙들의 순서적 나열이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일련의 규칙들을 어떻게 나열하는지에 따라 알고리즘의 종류가 달라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확성&amp;amp;효율성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;pseud code&lt;span&gt; (&lt;b&gt;의사코드)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언어를 사용해서 문제해결을 위한 생각을 명료하게 정리하여 표현하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) &amp;nbsp;&lt;span&gt;Pick up, Open to, Quit&lt;span&gt;&amp;nbsp;~&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;functions&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터에게 무엇을 할 지 알려주는 동사와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;conditions&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if, else if, else&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Boolean expressions&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;false, true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(yes or no, true or false,&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span data-type=&quot;ore&quot; data-lang=&quot;en&quot;&gt;1 or&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;0만을 이용하는 방식 / 질문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;loops&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복해서 순환하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) Go back to line 3 ~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cf. &lt;/b&gt;스크래치&lt;span&gt;&amp;nbsp;&lt;/span&gt;: MIT에서 만든 그래픽 프로그래밍 언어.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cf. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;decimal system = 10진법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;times = 곱한 five times two equals ten&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;capital letter 대문자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;exclamation mark 느낌표&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;character 글자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;super set 상위집합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vertical axis 수직축&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;efficiency 효율성&lt;/p&gt;</description>
      <category>Web dev</category>
      <category>CS</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/68</guid>
      <comments>https://a-develop.tistory.com/68#entry68comment</comments>
      <pubDate>Thu, 19 Jan 2023 00:01:53 +0900</pubDate>
    </item>
    <item>
      <title>JSP &amp;lt;form&amp;gt;태그 활용</title>
      <link>https://a-develop.tistory.com/56</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&amp;lt;form&amp;gt; 태그 값을 자바스크립트로 불러오는 법&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;변수선언 시 JQuery $() 값 사용&lt;/b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input태그의 id나 name 속성값으로 변수 선언 후 변수를 이용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676087181741&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var ITEM_IMG = $(&quot;#아이디명&quot;).val(); //해당 태그 id명
var ITEM_IMG = $(&quot;네임명&quot;).val(); //해당 태그 name명

const formObj = $(&quot;form&quot;); //form태그 전체&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 변수선언 시 EL ${} 값 사용&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676087189101&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const result = '&amp;lt;c:out value=&quot;${result}&quot;/&amp;gt;';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//var ITEM_ID = ${list[0].RE_ITEM};&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우에 작동이 안되거나 개발자 도구에서 오류뜨는 경우가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. input태그의 name속성으로 바로 가져오기&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676087196806&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$('input:radio[name=네임명]').is(&quot;:checked&quot;))&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;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. &amp;lt;form&amp;gt;태그를 javascript에서 submit하기&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1) &amp;lt;button type=&quot;button&quot;&amp;gt; onClick + &amp;lt;javascript&amp;gt; submit&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676086289542&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
function bsend() {
b.submit();
}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1672405967352&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body&amp;gt;
&amp;lt;form id=&quot;b&quot; action=&quot;gogo.go&quot; method=&quot;POST&quot;&amp;gt;
&amp;lt;label&amp;gt;값 입력&amp;lt;/label&amp;gt; &amp;lt;span class=&quot;box&quot;&amp;gt;&amp;lt;input type=&quot;text&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;
&amp;lt;button class=&quot;a&quot; type=&quot;button&quot;
onclick=&quot;bsend();&quot;&amp;gt;보내기&amp;lt;/button&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. &amp;lt;form&amp;gt; 태그 특정 값만 javascript로 넘기기&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1) &amp;lt;body&amp;gt; a태그 onClick + &amp;lt;javascript&amp;gt; location.href&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;body&amp;gt; a태그의 onClick의 값을 &amp;lt;script&amp;gt;부분으로 값을 전송하고 &amp;lt;javascript&amp;gt; location.href를 사용해 값을 전송한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;ex) &lt;b&gt;&lt;span&gt;&amp;lt;script&amp;gt; 함수의 매개변수에 값을 하나만 준다.&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676085758814&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body&amp;gt;
&amp;lt;a href=&quot;#&quot; onClick=&quot;paging('${pagination.next}')&quot;&amp;gt;[next]&amp;lt;/a&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1674780916705&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
	function paging(nowPage) {
		location.href = &quot;/item/productList.da?nowPage=&quot; + nowPage;
	}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;a href=&quot;#&quot; &lt;/i&gt;는&amp;nbsp; #뒤에 오는 id의 위치로 스크롤 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 id를 정해주지 않았기 때문에 [next] 버튼을 누르면 페이지 상단으로 스크롤되며 onClick의&amp;nbsp;함수가&amp;nbsp;&amp;lt;script&amp;gt;부분에서&amp;nbsp;실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex) &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;script&amp;gt; 함수의 매개변수에 값을 여러개 줄 수도 있다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674793813164&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
function paging(nowPage, ITEM_ID) {
	var ITEM_ID = ${list[0].RE_ITEM};
	location.href = &quot;/item/productList.da?nowPage=&quot; + nowPage + &quot;&amp;amp;ITEM_ID=&quot; + ITEM_ID;

&amp;lt;body&amp;gt;
&amp;lt;a href=&quot;#&quot; onClick=&quot;paging('${pagination.next}')&quot;&amp;gt;[next]&amp;lt;/a&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. &amp;lt;form&amp;gt; 태그를 여러 url로 보내기&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1) &amp;lt;button type=&quot;submit&quot;&amp;gt; formaction 속성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(form태그에 id설정하고 onclick=&quot;함수명();&quot;을 추가하면 자바스크립트로 모달창 등 작업도 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674844706964&quot; class=&quot;scala&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form method=&quot;POST&quot;&amp;gt;
&amp;lt;button class=&quot;aa&quot; type=&quot;submit&quot;
formaction=&quot;productDeletePro.da&quot;&amp;gt;1로 이동&amp;lt;/button&amp;gt;
&amp;lt;button class=&quot;aa&quot; type=&quot;submit&quot;
formaction=&quot;productUpdateForm.da&quot;&amp;gt;2로 이동&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2) &amp;lt;button type=&quot;submit&quot;&amp;gt; data-oper속성 + &amp;lt;javascript&amp;gt; .attr(&quot;action&quot;, &quot;url&quot;) submit&lt;br /&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1676085640261&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form role=&quot;form&quot; action=&quot;/controller/board/modify&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;button type=&quot;submit&quot;&amp;gt;수정 제출&amp;lt;/button&amp;gt;

&amp;lt;button type=&quot;submit&quot; data-oper='remove'&amp;gt;삭제&amp;lt;/button&amp;gt;

&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1676085681798&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$(document).ready(function() {
	const formObj = $(&quot;form&quot;);
	
	$('button').on(&quot;click&quot;, function(e){
		e.preventDefault();
		var operation = $(this).data(&quot;oper&quot;);
		
		console.log(operation);
		
		if(operation === 'remove') {
			formObj.attr(&quot;action&quot;, &quot;/controller/board/remove&quot;);
		}
		formObj.submit();
	});
});&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web dev</category>
      <category>javascript jquery</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/56</guid>
      <comments>https://a-develop.tistory.com/56#entry56comment</comments>
      <pubDate>Wed, 18 Jan 2023 22:26:54 +0900</pubDate>
    </item>
    <item>
      <title>코딩테스트 대비 알고리즘 공부법</title>
      <link>https://a-develop.tistory.com/67</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.udemy.com/course/comgong_codingtest_webinar/&quot;&gt;코딩테스트 대비 효율적 알고리즘 공부법 | Udemy&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;why?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 일관성, 공정성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 표준 입출력, 표준&amp;nbsp;&amp;nbsp;STL&lt;span style=&quot;color: #bdc1c6;&quot;&gt;(Standard Template Library) &lt;/span&gt;사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Problem Solving(문제해결력)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 플랫폼, 기술스택, 프레임워크 등과 관계없는 기초 능력.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;필수요소&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 독해력(문제파악) &lt;br /&gt;2. 배경지식(자료구조, 알고리즘 지식) &lt;br /&gt;3. 문제해결력(아이디어) &lt;br /&gt;4. 구현력(코딩) &lt;br /&gt;5. 검증,디버깅 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;학습 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 백준 브론즈 30문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 기초 개념 학습&lt;br /&gt;자료구조&amp;nbsp;-&amp;nbsp;배열,&amp;nbsp;스택,&amp;nbsp;큐,&amp;nbsp;우선순위&amp;nbsp;큐,&amp;nbsp;맵,&amp;nbsp;집합 &lt;br /&gt;알고리즘&amp;nbsp;-&amp;nbsp;그리디,&amp;nbsp;브루트포스,&amp;nbsp;DFS/BFS,&amp;nbsp;백트래킹,&amp;nbsp;DP,&amp;nbsp;이분탐색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 기초 개념 - 아이디어, 로직 연습 (문풀 but 구현x)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;4. 문풀&amp;amp;구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;5. 중급 개념 &lt;br /&gt;최단경로 탐색 알고리즘, 투 포인터, Union-Find, MST, 배낭DP, 위상 정렬 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;(6. 고급 - 대회 수준)&lt;/p&gt;</description>
      <category>etc</category>
      <category>Algorithm</category>
      <author>Adev</author>
      <guid isPermaLink="true">https://a-develop.tistory.com/67</guid>
      <comments>https://a-develop.tistory.com/67#entry67comment</comments>
      <pubDate>Wed, 18 Jan 2023 00:01:45 +0900</pubDate>
    </item>
  </channel>
</rss>