<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>yoob의 기술블로그</title>
    <link>https://yoon-developer.tistory.com/</link>
    <description>  Current : Back-end Developer　　　　　　　　　
  Interests : Kotlin, Restful API　　　　　　　　　　　　　　　　　　　　　　　　　
  Contact : psung616@naver.com</description>
    <language>ko</language>
    <pubDate>Sun, 14 Jun 2026 01:25:48 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>yoob</managingEditor>
    <image>
      <title>yoob의 기술블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/4304459/attach/f3948620086e4008bb37d71916cd87dc</url>
      <link>https://yoon-developer.tistory.com</link>
    </image>
    <item>
      <title>[Spring Boot] database 2개이상 connection 하는방법</title>
      <link>https://yoon-developer.tistory.com/134</link>
      <description>&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;1. application.properties&lt;/p&gt;
&lt;pre id=&quot;code_1694483396414&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring.datasource.main.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.main.jdbc-url=jdbc:log4jdbc:postgresql://ip:port/db
spring.datasource.main.username=
spring.datasource.main.password=

spring.datasource.sub.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.sub.jdbc-url=jdbc:log4jdbc:postgresql://ip:port/db
spring.datasource.sub.username=
spring.datasource.sub.password=&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main 과 sub 로 두개로 나눠서 설정해준다.&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. config&lt;/p&gt;
&lt;pre id=&quot;code_1694483461506&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
@EnableTransactionManagement
@MapperScan(value=&quot;com.snk.lab.main&quot;, sqlSessionFactoryRef = &quot;mainSqlSessionFactory&quot;)
public class MainDataSourceConfig {
	
	@Primary
	@Bean(name=&quot;mainDataSource&quot;)
	@ConfigurationProperties(prefix = &quot;spring.datasource.main&quot;)
	public DataSource dataSource() {
		return DataSourceBuilder.create().type(HikariDataSource.class).build();
	}

	@Primary
	@Bean(name=&quot;mainSqlSessionFactory&quot;)
	public SqlSessionFactory mainSqlSessionFactory(@Qualifier(&quot;mainDataSource&quot;) DataSource mainDataSource
			, ApplicationContext applicationContext) throws Exception{
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		sqlSessionFactoryBean.setDataSource(mainDataSource);
		
		sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources(&quot;classpath:mybatis/com/snk/lab/main/**/*.xml&quot;));
		
		return sqlSessionFactoryBean.getObject();
	}
	
	@Primary
	@Bean(name=&quot;mainSqlSessionTemplate&quot;)
	public SqlSessionTemplate mainSqlSessionTemplate(SqlSessionFactory mainSqlSessionFactory) throws Exception{
		return new SqlSessionTemplate(mainSqlSessionFactory);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1694483473731&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
@EnableTransactionManagement
@MapperScan(value=&quot;com.snk.lab.sub&quot;, sqlSessionFactoryRef = &quot;subSqlSessionFactory&quot;)
public class SubDataSourceConfig {
	
	@Bean(name=&quot;subDataSource&quot;)
	@ConfigurationProperties(prefix = &quot;spring.datasource.sub&quot;)
	public DataSource dataSource() {
		return DataSourceBuilder.create().type(HikariDataSource.class).build();
	}

	@Bean(name=&quot;subSqlSessionFactory&quot;)
	public SqlSessionFactory subSqlSessionFactory(@Qualifier(&quot;subDataSource&quot;) DataSource subDataSource
			, ApplicationContext applicationContext) throws Exception{
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		sqlSessionFactoryBean.setDataSource(subDataSource);
		
		sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources(&quot;classpath:mybatis/com/snk/lab/sub/**/*.xml&quot;));
		
		return sqlSessionFactoryBean.getObject();
	}
	
	@Bean(name=&quot;subSqlSessionTemplate&quot;)
	public SqlSessionTemplate subSqlSessionTemplate(SqlSessionFactory subSqlSessionFactory) throws Exception{
		return new SqlSessionTemplate(subSqlSessionFactory);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. controller&lt;/p&gt;
&lt;pre id=&quot;code_1694483654005&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
@RequestMapping(&quot;/migration&quot;)
public class MigrationController {

	@Autowired
	private MigrationService migrationService;
	
	@PostMapping(value=&quot;/module&quot;)
	public ResponseEntity&amp;lt;String&amp;gt; moduleMigration() {
	    try {
	        migrationService.moduleMigration();
	        return ResponseEntity.ok(&quot;Data migration completed successfully&quot;);
	    } catch (Exception e) {
	        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
	                             .body(&quot;Data migration failed: &quot; + e.getMessage());
	    }
	}
}&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. service&lt;/p&gt;
&lt;pre id=&quot;code_1694483642202&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
public class MigrationService {

	@Autowired
	private MainDataBaseMapper mainMapper;
	
	@Autowired
	private SubDataBaseMapper subMapper;
	
	@Transactional
	public void moduleMigration() throws Exception {
        // 기존 데이터베이스에서 정보를 가져옵니다.
        List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; subData = subMapper.selectSubModuleInfo();

        for(Map&amp;lt;String, Object&amp;gt; data : subData) {
        	Map&amp;lt;String, Object&amp;gt; transformData = transform(data);
        	System.out.println(transformData);
        }
        
    }
	
    /*사용하던 코드라 그대로 복붙해서 이부분은 참고안해도됨.*/
	public Map&amp;lt;String, Object&amp;gt; transform(Map&amp;lt;String, Object&amp;gt; originalData){
		Map&amp;lt;String, Object&amp;gt; data = new HashMap&amp;lt;&amp;gt;();
		
		data.put(&quot;del_yn&quot;, originalData.get(&quot;pmi_del_yn&quot;).toString());	// int 형태이기 때문에 문자열로 변경해줘야됨.
		data.put(&quot;frst_reg_dt&quot;, originalData.get(&quot;last_reg_dt&quot;));
		
		return data;
	}
	
}&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. mapper&lt;/p&gt;
&lt;pre id=&quot;code_1694483930752&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Mapper
public interface MainDataBaseMapper {
	void insertMainInfo(Map&amp;lt;String, Object&amp;gt; data) throws Exception;
	
	List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; getAllMainInfo() throws Exception;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1694483962467&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Mapper
public interface SubDataBaseMapper {
	 List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; getAllSubInfo() throws Exception;

	 List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; selectSubModuleInfo() throws Exception;
	 
}&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) com.snk.lab.main.management.mapper , com.snk.lab.sub.management.mapper&lt;/p&gt;</description>
      <category>2개</category>
      <category>Connection</category>
      <category>db</category>
      <category>Spring Boot</category>
      <category>데이터베이스</category>
      <author>yoob</author>
      <guid isPermaLink="true">https://yoon-developer.tistory.com/134</guid>
      <comments>https://yoon-developer.tistory.com/134#entry134comment</comments>
      <pubDate>Tue, 12 Sep 2023 11:01:59 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스 : Java] x만큼 간격이 있는 n개의 숫자</title>
      <link>https://yoon-developer.tistory.com/132</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 링크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12954&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12954&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693553046761&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12954&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bqYbvX/hyTL5Uwrwz/RvC5ZglqYRcCkidlneV1J0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/LO9UJ/hyTPEAW0zT/uqtARS1fcW1glHCmbDdVQ0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12954&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12954&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bqYbvX/hyTL5Uwrwz/RvC5ZglqYRcCkidlneV1J0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/LO9UJ/hyTPEAW0zT/uqtARS1fcW1glHCmbDdVQ0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 풀이&lt;/p&gt;
&lt;pre id=&quot;code_1693553051259&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        for(int i=1; i&amp;lt;=n; i++){    // i가 1부터 시작해야 * 했을때 0으로 안나옴
            answer[i-1] = (long)x*i;    // -10000000 이상, 10000000 이하 이기때문에 long으로 형변환시켜준다.
        }
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스 코테/프로그래머스 Lv. 1</category>
      <author>yoob</author>
      <guid isPermaLink="true">https://yoon-developer.tistory.com/132</guid>
      <comments>https://yoon-developer.tistory.com/132#entry132comment</comments>
      <pubDate>Fri, 1 Sep 2023 16:24:12 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스 : Java] 최솟값 만들기</title>
      <link>https://yoon-developer.tistory.com/131</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 링크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12941&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12941&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693551504625&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12941&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bE3QmN/hyTPvD1kI5/kutgZu1kKGPV9aROrDYSjk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/OrQVT/hyTL3bkHBf/7B32zUh78m5FujoSsKLVpK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12941&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12941&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bE3QmN/hyTPvD1kI5/kutgZu1kKGPV9aROrDYSjk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/OrQVT/hyTL3bkHBf/7B32zUh78m5FujoSsKLVpK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 코드&lt;/p&gt;
&lt;pre id=&quot;code_1693551578099&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

class Solution
{
    public int solution(int []A, int []B)
    {
        int sum = 0;
        Integer[] bb = new Integer[B.length];   // 기본 데이터타입으로는 내림차순이 안됨. 내림차순으로 정렬해주기위해 레퍼형태로 변경
        
        for(int i=0; i&amp;lt;B.length; i++){
            bb[i] = Integer.valueOf(B[i]);  // B의 값을 bb 에 넣어줌
        }
        
        Arrays.sort(A); // 오름차순정렬
        Arrays.sort(bb, Collections.reverseOrder());    // 내림차순정렬
        for(int i=0; i&amp;lt;A.length; i++){
            sum += A[i]*bb[i];  
        }
        
        return sum;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래머스 코테/프로그래머스 Lv. 2</category>
      <author>yoob</author>
      <guid isPermaLink="true">https://yoon-developer.tistory.com/131</guid>
      <comments>https://yoon-developer.tistory.com/131#entry131comment</comments>
      <pubDate>Fri, 1 Sep 2023 15:59:41 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스 : MySql] 조건에 부합하는 중고거래 댓글 조회</title>
      <link>https://yoon-developer.tistory.com/130</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 링크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/164673?language=mysql&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/164673?language=mysql&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1693484952955&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/164673?language=mysql&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cYE9Ov/hyTPEANw5r/6CiE8mxIPhk1MuIPXO4Ko1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/c20obx/hyTL6yXv6N/XAF1kHppXhzNbPBhVESRL0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/164673?language=mysql&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/164673?language=mysql&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cYE9Ov/hyTPEANw5r/6CiE8mxIPhk1MuIPXO4Ko1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/c20obx/hyTL6yXv6N/XAF1kHppXhzNbPBhVESRL0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. sql문&lt;/p&gt;
&lt;pre id=&quot;code_1693484957358&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 코드를 입력하세요
SELECT a.title, a.board_id, b.reply_id, b.writer_id, b.contents, date_format(b.created_date,'%Y-%m-%d') as created_date
from used_goods_board a inner join used_goods_reply b on a.board_id = b.board_id
where a.created_date like '2022-10%' order by b.created_date asc, a.title asc ;&lt;/code&gt;&lt;/pre&gt;</description>
      <author>yoob</author>
      <guid isPermaLink="true">https://yoon-developer.tistory.com/130</guid>
      <comments>https://yoon-developer.tistory.com/130#entry130comment</comments>
      <pubDate>Thu, 31 Aug 2023 21:29:19 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스 : Java] 원소들의 곱과 합</title>
      <link>https://yoon-developer.tistory.com/129</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 링크&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/181929&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/181929&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693484012003&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/181929&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Y9Yac/hyTPCprHug/OqIecpFAe3amNM3Jp5Lr4k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/9GfRZ/hyTPEHzmQh/7qKtfKEKgKHxoXwynT3YK1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/181929&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/181929&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Y9Yac/hyTPCprHug/OqIecpFAe3amNM3Jp5Lr4k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/9GfRZ/hyTPEHzmQh/7qKtfKEKgKHxoXwynT3YK1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1693484016025&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

class Solution {
    public int solution(int[] num_list) {
        int a = 1;  // 곱
        int b = 0;  // 합
        for(int i=0; i&amp;lt;num_list.length; i++){
            a *= num_list[i];
            b += num_list[i];
        }
        
        double bb = Math.pow(b, 2); // 제곱
        
        System.out.println(a + &quot; &quot; + bb);
        
        if(a &amp;lt;= bb){
            return 1;    
        }else{
            return 0;
        }
        
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래머스 코테/프로그래머스 Lv. 0</category>
      <author>yoob</author>
      <guid isPermaLink="true">https://yoon-developer.tistory.com/129</guid>
      <comments>https://yoon-developer.tistory.com/129#entry129comment</comments>
      <pubDate>Thu, 31 Aug 2023 21:13:38 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] 공공데이터 API 를 활용하여 DataBase 에 Scheduled를 통해 insert 하기</title>
      <link>https://yoon-developer.tistory.com/128</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.data.go.kr/index.do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.data.go.kr/index.do&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1691651080396&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;공공데이터 포털&quot; data-og-description=&quot;국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유&amp;bull;활용할 수 있도록 공공데이터(Datase&quot; data-og-host=&quot;www.data.go.kr&quot; data-og-source-url=&quot;https://www.data.go.kr/index.do&quot; data-og-url=&quot;https://www.data.go.kr/index.do&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.data.go.kr/index.do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.data.go.kr/index.do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;공공데이터 포털&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유&amp;bull;활용할 수 있도록 공공데이터(Datase&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.data.go.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공공데이터를 사용 할 일이 있어서 위의 포털에서 데이터를 DB에 밀어넣을 일이 생겼다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 공공데이터포털에서 로그인 &amp;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;b&gt;1. controller&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1691651281483&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 *  1. www.data.go.kr (공공데이터포털)
 *  2. 표준산업분류코드 API
 *  3. 24개월마다 갱신해줘야됨 (마지막 갱신일 2023.08.09 박성윤)
 *  4. 데이터는 JSON 형태로 받아옴
 * */
@RestController
@RequestMapping(&quot;/api/batch/indust&quot;)
public class IndustController {
	
	@Autowired
	private IndustService industService;
	
	@Value(&quot;${api.url}&quot;) // application.properties 또는 yml 파일에 설정한다.
	private String apiUrl;
	
	@Value(&quot;${api.serviceKey}&quot;) // application.properties 또는 yml 파일에 설정한다.
	private String serviceKey;

	@PostMapping
	@Scheduled(cron = &quot;0 0 3 1 9 ?&quot;)
    public ResponseEntity&amp;lt;String&amp;gt; industBatch() throws Exception{
        try {
            String responseData = fetchDataFromAPI();
            // 가져온 데이터를 DTO 객체 리스트로 파싱
            List&amp;lt;IndustDataDto&amp;gt; dataList = parseResponseData(responseData);
 			// 데이터를 DB에 저장
 			industService.insertData(dataList);

            return ResponseEntity.ok(responseData);
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
        }
    }

	private List&amp;lt;IndustDataDto&amp;gt; parseResponseData(String responseData) throws Exception {
        JSONObject jsonObj = new JSONObject(responseData);
        JSONArray dataArray = jsonObj.getJSONArray(&quot;data&quot;);

        List&amp;lt;IndustDataDto&amp;gt; dataList = new ArrayList&amp;lt;&amp;gt;();

        for (int i = 0; i &amp;lt; dataArray.length(); i++) {
            JSONObject item = dataArray.getJSONObject(i);
            IndustDataDto data = new IndustDataDto();

            data.setMajor_emp_name(item.optString(&quot;고용업종명(대분류)&quot;));
            data.setMajor_emp_code(item.optString(&quot;고용업종코드(대분류)&quot;));

            data.setSub_emp_name(item.optString(&quot;고용업종명(중분류)&quot;));
            if(!item.isNull(&quot;고용업종코드(중분류)&quot;)) {
                data.setSub_emp_code(item.getInt(&quot;고용업종코드(중분류)&quot;));
            }

            data.setMinor_emp_name(item.optString(&quot;고용업종명(소분류)&quot;));
            if(!item.isNull(&quot;고용업종코드(소분류)&quot;)) {
                data.setMinor_emp_code(item.getInt(&quot;고용업종코드(소분류)&quot;));
            }

            data.setDetail_emp_name(item.optString(&quot;고용업종명(세세분류)&quot;));
            if(!item.isNull(&quot;고용업종코드(세세분류)&quot;)) {
                data.setDetail_emp_code(item.getInt(&quot;고용업종코드(세세분류)&quot;));
            }

            dataList.add(data);
        }
        return dataList;
    }
	
    private String fetchDataFromAPI() throws Exception {
    	// API URL 구성
        StringBuilder urlBuilder = new StringBuilder(apiUrl);
        urlBuilder.append(&quot;?&quot; + URLEncoder.encode(&quot;serviceKey&quot;,&quot;UTF-8&quot;) + &quot;=&quot; + serviceKey);
        urlBuilder.append(&quot;&amp;amp;&quot; + URLEncoder.encode(&quot;page&quot;,&quot;UTF-8&quot;) + &quot;=&quot; + URLEncoder.encode(&quot;1&quot;,&quot;UTF-8&quot;));
        urlBuilder.append(&quot;&amp;amp;&quot; + URLEncoder.encode(&quot;perPage&quot;,&quot;UTF-8&quot;) + &quot;=&quot; + URLEncoder.encode(&quot;1200&quot;,&quot;UTF-8&quot;));
		// HTTP 요청 수행
        URL url = new URL(urlBuilder.toString());

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod(&quot;GET&quot;);
        conn.setRequestProperty(&quot;Content-type&quot;, &quot;application/json&quot;);

        try (BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = rd.readLine()) != null) {
                sb.append(line);
            }
            return sb.toString();
        } finally {
            conn.disconnect();
        }
    }
    
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Service&lt;/h2&gt;
&lt;pre id=&quot;code_1691653608977&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
public class IndustService {

	@Autowired
	private IndustMapper industMapper;
	
	public void insertData(List&amp;lt;IndustDataDto&amp;gt; dataList) {
		for(IndustDataDto data : dataList) {
			industMapper.insertIndustData(data);
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Mapper&lt;/h2&gt;
&lt;pre id=&quot;code_1691653632100&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Mapper
public interface IndustMapper {

	void insertIndustData(IndustDataDto data);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Framework/Spring Boot </category>
      <category>API</category>
      <category>http요청</category>
      <category>REST API</category>
      <category>Spring Boot</category>
      <category>공공데이터</category>
      <category>스케줄링</category>
      <author>yoob</author>
      <guid isPermaLink="true">https://yoon-developer.tistory.com/128</guid>
      <comments>https://yoon-developer.tistory.com/128#entry128comment</comments>
      <pubDate>Thu, 10 Aug 2023 16:47:56 +0900</pubDate>
    </item>
    <item>
      <title>[PostgreSql] Boolean 타입 데이터 삽입</title>
      <link>https://yoon-developer.tistory.com/127</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 마이그레이션을 하는 도중 boolean 데이터타입에 어떤 값들이 들어갈수 있는지 궁금해서 찾아봤다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;postgresql의 boolean 타입 컬럼에 대한 입력 값&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;true 는 'true', 't', 'yes', 'y', 'on', '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;false 는 'false', 'f', 'no', 'n', 'off', '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;솔직히 true/false 또는 1/0 은 알고있었지만 다른부분들은 있는지 몰랐는데 이번에 알게됨 ㅎㅎ&lt;/p&gt;</description>
      <category>DBMS/DataBase</category>
      <category>booelan</category>
      <category>PostgreSQL</category>
      <author>yoob</author>
      <guid isPermaLink="true">https://yoon-developer.tistory.com/127</guid>
      <comments>https://yoon-developer.tistory.com/127#entry127comment</comments>
      <pubDate>Wed, 9 Aug 2023 10:16:20 +0900</pubDate>
    </item>
    <item>
      <title>[DataBase] 데이터베이스에서의 Null 에 대한 깨달음(필독!!)</title>
      <link>https://yoon-developer.tistory.com/126</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;페이스북 광고가 떠서 보다가 아래와 같은 문제가 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;다음 쿼리문의 빈칸에 들어가면 오류가 생기는 구문을 고르시오.&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;문제 : select ( ) from dual;&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. null+1 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. null * null &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 2/null &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. null&amp;lt;1&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이해못하고 순간벙쪄서 보는데 처음엔 null이 더하기 곱하기 나누기 다 된다고?? 싶어서 모두 다 정답아니야? 라고 생각했는데 진짜 오만이었다..&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정답은 3번 이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;ChrisPrattAndyDwyerGIF.gif&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4XVsE/btso0PUUZJe/TarnJeHSXx9J9tynJPdCx0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4XVsE/btso0PUUZJe/TarnJeHSXx9J9tynJPdCx0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4XVsE/btso0PUUZJe/TarnJeHSXx9J9tynJPdCx0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/b4XVsE/btso0PUUZJe/TarnJeHSXx9J9tynJPdCx0/img.gif&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;498&quot; height=&quot;347&quot; data-filename=&quot;ChrisPrattAndyDwyerGIF.gif&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/h2&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;NULL에 더하기와 곱하기 연산을 수행할 수 있다. 하지만 NULL과 숫자를 더하거나 곱하면 결과는 항상 NULL이 된다. 이는 데이터베이스의 특성으로, NULL은 &quot;알 수 없는 값&quot;을 나타내기 때문에 숫자와의 연산 결과도 알 수 없는 값이 되는 것이다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예를 들어:&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;NULL + 1 = NULL&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;NULL * 5 = NULL&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한, 나눗셈 연산에서 0으로 나누는 것은 오류를 발생시키기 때문에 다음과 같이 NULL과 나눗셈을 조합하는 경우도 오류가 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2 / NULL = NULL (오류 발생)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이러한 특성을 이해하고 쿼리문 작성 시 주의하여야 한다. 연산 중에 NULL 값이 발생하지 않도록 NULL 여부를 체크하거나 NVL 함수 등을 사용하여 NULL 값을 다른 값으로 대체하는 방법을 고려할 수 있다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;라는 내용을 찾았다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정말 기초인데도 애매한 부분이었던것같다. 더 공부할수있도록 해야겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DBMS/DataBase</category>
      <category>null</category>
      <category>기초</category>
      <category>데이터베이스</category>
      <category>속성</category>
      <author>yoob</author>
      <guid isPermaLink="true">https://yoon-developer.tistory.com/126</guid>
      <comments>https://yoon-developer.tistory.com/126#entry126comment</comments>
      <pubDate>Wed, 26 Jul 2023 13:47:53 +0900</pubDate>
    </item>
    <item>
      <title>[SpringBoot/JPA] 자동화로 최초생성일과 최종수정일 입력하는 방법</title>
      <link>https://yoon-developer.tistory.com/125</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 데이터베이스 이력관리 테이블에 따라 항상 최초생성일과 최종수정일은 붙어다닌다.&lt;/p&gt;
&lt;pre id=&quot;code_1690336161832&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MbrEntity mbrntity = MbrEntity.builder()
				.frstDt(LocalDateTime.now())
                .updtDt(LocalDateTime.now())
				.build();&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;JPA에서 일일히 엔티티마다 작성해주기엔 너무 노가다라서,,, 이를 위해 반복된 작업을 없애기위한 방법을 작성한다.&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;Spring Boot 기준으로 Application.java 파일에서 이렇게 수정해주자&lt;/p&gt;
&lt;pre id=&quot;code_1690336264543&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing
@SpringBootApplication
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

}&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;@JpaAuditing 어노테이션을 추가해준다.&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;그다음 Entity 에서 아래와 같이 수정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690336349643&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@CreatedDate
	@Comment(&quot;최초등록일시&quot;)
	private LocalDateTime frstDt;
	
	@LastModifiedDate
	@Comment(&quot;최종수정일시&quot;)
	private LocalDateTime updtDt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@CreatedDate : 최초등록할때 jpa 가 자동으로 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@LastModifiedDate : 수정할때 jpa 가 자동으로 수정&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;그리고 마지막으로 entity 클래스의 어노테이션으로 이걸 추가해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1690348035259&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@EntityListeners(AuditingEntityListener.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;이제 신경쓰지않아도 인스턴스가 생성되거나 수정될때 자동으로 입력되는것을 확인할수있다.&lt;/p&gt;</description>
      <category>Framework/JPA</category>
      <category>JPA</category>
      <category>Spring Boot</category>
      <category>데이터베이스</category>
      <category>생성일</category>
      <category>수정일</category>
      <category>스프링부트</category>
      <category>자동화</category>
      <category>하이버네이트</category>
      <author>yoob</author>
      <guid isPermaLink="true">https://yoon-developer.tistory.com/125</guid>
      <comments>https://yoon-developer.tistory.com/125#entry125comment</comments>
      <pubDate>Wed, 26 Jul 2023 10:53:36 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] Spring Security 의존성 추가 시 bulid.gradle 파일 에러 해결</title>
      <link>https://yoon-developer.tistory.com/124</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot 프로젝트 진행중에 로그인관련한 라이브러리를 사용하기위해 Security 의존성을 추가했다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN3w4R/btsoSk9djXj/xn20zMxcbMKqlLVVd0yIH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN3w4R/btsoSk9djXj/xn20zMxcbMKqlLVVd0yIH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN3w4R/btsoSk9djXj/xn20zMxcbMKqlLVVd0yIH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN3w4R%2FbtsoSk9djXj%2Fxn20zMxcbMKqlLVVd0yIH1%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;658&quot; height=&quot;63&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;63&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1Vtsw/btsoTnreTXw/LoqqFMlOLc2wS6QvnD1zq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1Vtsw/btsoTnreTXw/LoqqFMlOLc2wS6QvnD1zq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1Vtsw/btsoTnreTXw/LoqqFMlOLc2wS6QvnD1zq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1Vtsw%2FbtsoTnreTXw%2FLoqqFMlOLc2wS6QvnD1zq1%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;421&quot; height=&quot;91&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wLfrq/btsoYhRqPJC/oy9vMsbyFjZKK6MDVtyuh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wLfrq/btsoYhRqPJC/oy9vMsbyFjZKK6MDVtyuh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wLfrq/btsoYhRqPJC/oy9vMsbyFjZKK6MDVtyuh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwLfrq%2FbtsoYhRqPJC%2Foy9vMsbyFjZKK6MDVtyuh0%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;659&quot; height=&quot;41&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;41&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;아무래도 버전별로 차이가 있기때문에 그런거같긴한데..&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;나는 spring boot 3 버전이 익숙치 않아서 아직까진 2버전을 쓰고있다.&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;여튼 결론적으로 &lt;b&gt;버전을 꼭 맞춰&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;의존성 검색 사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://xn--mvnrepository-9u13d.com/artifact/org.springframework.boot/spring-boot-starter-security/2.7.13&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://xn--mvnrepository-9u13d.com/artifact/org.springframework.boot/spring-boot-starter-security/2.7.13&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Framework/Spring Boot </category>
      <category>springboot</category>
      <category>에러</category>
      <category>해결</category>
      <author>yoob</author>
      <guid isPermaLink="true">https://yoon-developer.tistory.com/124</guid>
      <comments>https://yoon-developer.tistory.com/124#entry124comment</comments>
      <pubDate>Tue, 25 Jul 2023 17:05:21 +0900</pubDate>
    </item>
  </channel>
</rss>