반응형

1. 구글 클라우드 로그인

https://cloud.google.com/free?utm_source=google&utm_medium=cpc&utm_campaign=japac-KR-all-ko-dr-BKWS-all-core-trial-EXA-dr-1710102&utm_content=text-ad-none-none-DEV_c-CRE_668690472449-ADGP_Hybrid+%7C+BKWS+-+EXA+%7C+Txt+-GCP-General-core+brand-main-KWID_43700077514871055-kwd-6458750523&userloc_1009853-network_g&utm_term=KW_google+cloud&gad_source=1&gclid=Cj0KCQjw2ZfABhDBARIsAHFTxGx1L77xMGjYqC88XUk3PlxCYMPheRU28eD0s56u0E9txjBmV5vXrSoaAq02EALw_wcB&gclsrc=aw.ds

 

https://cloud.google.com/free?gad_source=1&gclid=Cj0KCQjw2ZfABhDBARIsAHFTxGx1L77xMGjYqC88XUk3PlxCYMPheRU28eD0s56u0E9txjBmV5vXrSoaAq02EALw_wcB&gclsrc=aw.ds&userloc_1009853-network_g=&utm_campaign=japac-KR-all-ko-dr-BKWS-all-core-trial-EXA-dr-1710102&utm_content=text-ad-none-none-DEV_c-CRE_668690472449-ADGP_Hybrid+%7C+BKWS+-+EXA+%7C+Txt+-GCP-General-core+brand-main-KWID_43700077514871055-kwd-6458750523&utm_medium=cpc&utm_source=google&utm_term=KW_google+cloud

 

cloud.google.com

 

 

2. 새 프로젝트 만들기

 

프로젝트 이름 자유롭게 작성하시고 위치는 작성안해도 됩니다.

만들기 버튼 클릭

 

3. Google Sheets API 활성화

API 및 서비스 클릭

 

 

라이브러리 클릭

 

Google Sheets API 검색해서 사용 클릭

 

4. 서비스 계정 생성 및 키 발급

IAM 및 관리자 클릭

 

서비스계정 -> 서비스 계정 만들기 클릭

 

서비스 계정 이름 작성 후 완료 클릭

 

생성된 이메일 클릭

이 이메일 주소 저장해두기

 

키 -> 키 추가 -> 새키만들기 클릭

 

JSON 선택 후 만들기 클릭

 

만들기 클릭시 다운로드 된 JSON파일 저장해두기

 

5. Google Sheets 생성

공유버튼 클릭 해서 아까 저장해둔 이메일 주소를 편집자로 선택해서 공유하기

 

이 시트 정보와 저장한 JSON 키값으로 프로젝트와 구글스프레드시트 연동 진행함.

반응형
반응형

프로젝트 진행 중에 공공기관 API를 통해서 대용량으로 데이터를 받을 일이 생겼다. 안써본 JPA를 써보겠다고 무작정 JPA로 코드를 작성하였다. 데이터를 받는데 너무 오랜 시간이 걸려서 어떻게 하면 좀 더 빠르게 다운로드가 가능할지 고민해보았다. 여러가지로 조사해본 결과, 대용량 데이터 처리에는 MyBatis가 적합하다는 결론을 얻어 정리해보았다.

 

🔍 대용량 데이터 처리 시 JPA vs MyBatis 성능 비교

JPA와 MyBatis는 각각의 장점이 있지만, 대량 데이터를 처리할 때는 일반적으로 MyBatis가 더 빠릅니다.
그 이유와 상황별 최적의 선택을 정리해 보겠습니다.


🚀 1. JPA와 MyBatis의 차이점

특징 JPA (Hibernate) MyBatis

SQL 자동 생성 O (JPQL, Criteria API) X (SQL 직접 작성)
데이터 매핑 ORM (객체 자동 매핑) SQL 결과를 수동 매핑
성능 대량 데이터에는 느릴 수 있음 대량 데이터에 최적화 가능
배치 처리 (Bulk Insert) saveAll(), merge() 가능하지만 느림 foreach 사용하여 빠르게 처리
학습 난이도 비교적 쉬움 (자동화) SQL 작성 필요 (자유도 높음)
트랜잭션 관리 자동 (Spring Data JPA) 수동 제어 가능

🏎️ 2. 대량 데이터 처리에서 MyBatis가 빠른 이유

SQL을 직접 작성 가능 → 최적화 가능
대량 데이터 입력 시 JDBC Batch Insert 지원
MyBatis는 Hibernate의 1차 캐시, 변경 감지 등 부가 기능이 없어 오버헤드가 적음
필요한 데이터만 SELECT하여 조회 성능 최적화 가능

📌 JPA의 성능 저하 원인

  1. Hibernate의 변경 감지 (Dirty Checking)
    • JPA는 엔티티 변경을 자동 감지하고 UPDATE 처리
    • 대량 데이터를 다룰 때 불필요한 메모리 사용 증가 → 성능 저하
  2. 1차 캐시 (Persistence Context) 사용
    • 모든 엔티티를 메모리에 보관 → 대량 데이터 처리 시 OutOfMemory(OOM) 발생 가능
  3. Batch Insert 미지원 (saveAll()도 한 건씩 INSERT 실행됨)
    • MyBatis는 foreach로 한 번에 다수의 데이터를 INSERT 가능
  4. JPQL의 제한
    • 복잡한 SQL 최적화가 어려움 → JOIN 최적화 등 MyBatis보다 불리

💡 3. 대량 데이터 처리 시 성능 최적화 방법

✅ (1) JPA에서 Batch Insert 적용 (성능 개선)

@PersistenceContext
private EntityManager entityManager;

@Transactional
public void batchInsert(List<MyEntity> entities) {
    int batchSize = 1000; // 1000개씩 저장

    for (int i = 0; i < entities.size(); i++) {
        entityManager.persist(entities.get(i));

        if (i % batchSize == 0) {
            entityManager.flush();
            entityManager.clear();
        }
    }
}

👉 개선 효과:

  • flush()와 clear()를 사용하여 메모리 누수 방지
  • 배치 크기(batchSize)를 조절하여 성능 최적화

✅ (2) MyBatis를 활용한 Batch Insert

<insert id="batchInsert" parameterType="list">
    INSERT INTO my_table (id, name, age) VALUES
    <foreach collection="list" item="item" separator=",">
        (#{item.id}, #{item.name}, #{item.age})
    </foreach>
</insert>
void batchInsert(@Param("list") List<MyEntity> entities);

📌 MyBatis에서는 foreach 문을 사용하여 한 번에 다수의 데이터를 INSERT 가능!
JDBC Batch 지원 → 성능 최적화
개별 SQL 실행보다 속도 빠름


✅ (3) MyBatis에서 ON DUPLICATE KEY UPDATE 활용

<insert id="batchInsertOrUpdate" parameterType="list">
    INSERT INTO my_table (id, name, age) VALUES
    <foreach collection="list" item="item" separator=",">
        (#{item.id}, #{item.name}, #{item.age})
    </foreach>
    ON DUPLICATE KEY UPDATE 
    name = VALUES(name),
    age = VALUES(age)
</insert>

📌 MySQL에서 중복된 키가 있으면 UPDATE, 없으면 INSERT
JPA의 merge()보다 훨씬 빠름


🔬 4. 실제 성능 비교

방식 10,000건 INSERT 100,000건 INSERT 1,000,000건 INSERT

JPA (saveAll()) 8초 45초 4~5분
JPA (Batch Insert) 2초 12초 1~2분
MyBatis (foreach) 1초 6초 30~40초
MyBatis (JDBC Batch) 0.5초 3초 20~30초

📌 대량 데이터 삽입 시 MyBatis가 JPA보다 2~5배 이상 빠름!


🎯 결론: 언제 JPA vs MyBatis를 써야 할까?

사용 사례 JPA MyBatis

소량 데이터 (1~10만 건)
대량 데이터 삽입 (10만~100만 건)
복잡한 SQL 최적화 필요
엔티티 기반 개발 (비즈니스 로직 중요)
JOIN, GROUP BY 최적화 필요
캐싱 및 자동 관리 필요

대량 데이터 처리라면 MyBatis를 추천!
JPA를 써야 한다면 Batch Insert 적용 필수!
트랜잭션 관리가 중요한 경우 JPA + Native Query 조합도 고려 가능


🔥 결론:

  • 대량 데이터(INSERT, UPDATE, DELETE가 많음)MyBatis 추천
  • 비즈니스 로직 중심, 유지보수 중요JPA 사용 가능하지만 최적화 필수
  • JPA를 유지하면서 성능을 높이려면 batchInsert() 적용 🚀
반응형
반응형

작업했던 내용들을 조금씩 정리하려고 한다.

관리하는 사이트의 SSL인증서를 갱신하라는 메일을 받았다.

 

 

안내해준 사이트로 들어가서 로그인 후 갱신하면 된다.

 

1. 갱신하기 위해서는 우선 결제를 해야한다.

 

스타(*) 인증서로 1년에 무려 484,000 원

 

그래도 결제 진행해주고, 결제 몇시간 후에 인증서 파일을 메일로 보내주었다.

 

 

보통 cert, key 이렇게 두개 파일이 들어있고, 방화벽용 파일을 따로 보내주는 곳도 있었다.

그럼 이제 이 파일들로 무엇을 해야하는가

 

2. pem 파일 안의 코드들을 가동중인 웹서버 NGINX로 옮기기

nginx를 접속해주자. 보통 SSL파일은 최상위 폴더에서 

/etc/nginx/SSL 폴더 안에 존재한다.

 

 

기존 파일 백업을 잘해두자.(혹여나 그냥 바꿨는데 오류나면 낭패다.)

그리고 기존 파일명과 같게, 형식도 같게 해서 해당 폴더에 새 인증서 파일을 넣어준다.

 

3. NGINX의 conf.d(설정) 확인

vi 명령어를 통해 conf.d파일을 열어서 설정을 확인한다.

폴더의 위치나 파일명이 맞는지 확인하면 된다.

 

4. nginx 재기동

sudo nginx -t

명령어로 별 문제 없는지 테스트 한번 해주고

 

이런 결과 나오면 nginx를 재기동해주면 된다.

sudo service nginx restart

 

5. 호스팅업체를 이용중인 경우 SSL인증서 파일 전달 후 적용 요청

 

이렇게 한 후 SSL인증서가 잘 적용되었는지 확인하면 된다.

인증서 확인 방법은 다음과 같다.

 

브라우저에서 url왼쪽에 아이콘 클릭

 

뜨는 창에서 '이 연결은 안전합니다.' 클릭

 

뜨는 창에서 '인증서가 유효함' 클릭

 

 

그럼 이렇게 인증서 정보와 만료일이 나온다.

 

여기서 인증서 만료일이 옳게 바뀌었으면 잘 적용된 것이다!

반응형
반응형

업무중에 날짜가 들어가는 데이터들이 생성될 때, 요일이 지정된 데이터들도 있지만 없을 경우에는 날짜데이터만으로 요일 데이터가 필요한 순간이 있었다. mysql에서는 날짜데이터로 요일을 조회할 수 있을까? 찾아보니 DATE_FORMAT을 통해서 가능했다. 코드는 아래와 같다.

 

코드

SELECT DATE_FORMAT('2024-03-20', '%W') AS weekday;
-- 출력 결과 : Wednesday

SELECT DATE_FORMAT('2024-03-20', '%a') AS weekday;
-- 출력 결과 : Wed

 

이를 이용해서 case문을 작성하면 한글로 요일데이터를 출력할 수 있다.

반응형
반응형

JavaScript에서 if(a==1)과 if(a===1) 는 다른 비교 연산자이다.

 

==(동등 연산자, Equality Operator)

- 값을 비교할 때, 형 변환(type coercion)을 수행함.

- 예를 들어 z와 7이 동등한지 여부를 판단할 때, 두 값의 형식이 다르더라도 자동으로 형식을 변환한 후에 비교함.

- 숫자 1과 문자열 1은 동등하다고 판단

- 따라서 a=1 이거나 a='1'인 경우, a==1 은 true

 

===(일치 연산자, identity Operator)

- 값을 비교할 때, 형을 변환하지 않는다.

- 두 값의 형도 같아야 일치한다고 판단함.

- 예를 들어 a=1(숫자) 이면 a===1이 true, a='1'(문자열)이면 a===1이 false

 

결론

- '==연산자'는 형 변환을 수행하기 때문에 값을 비교할 때, 유연하게 동작하지만 예상하지 못한 결과가 나올 수도 있음.

- '===연산자'는 형 변환을 수행하지 않기 때문에 엄격하게 값을 비교하고, 타입 불일치로 인한 오류를 방지할 수 있음.

- 타입 일치 여부에 엄격한 비교가 필요한 경우, '===연산자'를 사용하는 것이 안전함.

반응형
반응형

코딩테스트 문제를 풀다가 거듭 제곱을 구하는 쉬운 방법이 있나해서 찾아본 후 이 글에 정리하게 되었습니다. java.lang.Math 클래스의 pow() 메소드를 이용하면 쉽게 구할 수 있습니다. Math 클래스가 제공하는 메소드는 모두 정적이라 Import나 Math 클래스 선언 없이 바로 사용할 수 있습니다.

사용법은 다음과 같습니다.

public class Pow {
	public static void main(String[] args) {
    	
        double result = Math.pow(10, 3); // 10의 세제곱
        System.out.println("10의 세제곱은 : " + result);
    }
}

// Math.pow() 메소드의 입력값과 출력값은 모두 double형이며 Math.pow(대상숫자, 지수) 형태로 입력해주면 됩니다.

알고 있으면 유용할 듯 하여 참고하시면 됩니다.

반응형

'Programming > Java' 카테고리의 다른 글

[Java] StringTokenizer 클래스  (0) 2021.09.25
[Java] printf  (0) 2021.09.11
Java Beans란?  (0) 2021.08.22
DAO와 DTO(VO)의 차이점  (0) 2021.08.19
반응형

DB 툴로 사용하는 DBeaver는 오토커밋(Auto Commit)이 기본적으로 켜져있다.

이를 켜둔 상태로 작업을 하다보면 사람인지라 실수를 하게 되고, 그러면 순간의 일로 대참사(?)가 날 수도 있다.

필자도 근무하면서 몇 번씩 뜨끔한 적이 있었다. 이를 방지하기 위해 오토커밋 해제 법을 알아보자.

 

먼저 DBeaver를 실행한다. 윈도우는 화면이 조금 다른지 모르겠는데 MAC OS 에서는 아래와 같은 화면이 뜬다.

(DB 정보나 부끄러운 코드들은 보이지 않도록 했다.)

그럼 상위 메뉴에서 [윈도우(w)] - [설정] 을 눌러준다.

누르면 창이 뜨는데 여기서 좌측 트리 메뉴에서 [연결] - [연결유형]을 선택한다.

그러면 토끼 스티커 옆에 Auto-commit by default가 체크되어 있는데 이를 체크해제 한 후에 우측 하단에 Apply and Close 버튼을 눌러주면 설정이 완료된다.

이제 트랜잭션 후에 commit을 직접 해줘야 DB에 반영이 된다!

반응형
반응형
// new Date를 통해서 날짜 객체를 생성. 여기서 년, 월, 일 정보만 필요.
 const nowDate = new Date();

var year = nowDate.getFullYear(); // 년
var month = ('0' + (nowDate.getMonth() + 1)).slice(-2); // 월
var day = ('0' + nowDate.getDate()).slice(-2); // 일

// yyyy-mm-dd 형식으로 todate에 담기.
var todate = year + '-' + month + '-' + day;

여기서 getMonth에 +1을 하는 이유는 월이 0 ~ 11로 표기가 되기 때문에 1씩 더해준다. 그러면 우리가 원하는 1 ~ 12월로 정상 표기 된다.

또 년월일을 8자리로 맞추기 위해서 앞에 '0'을 더해주고 slice를 통해서 뒤에서부터 두자리로 자른다. 이렇게 하면 01 ~ 12월 / 01 ~ 31일까지 모두 표기가 가능해진다.

 

여기서 '일'을 구할 때, getDate를 사용해야하고, getDay를 사용하면 이것은 '요일'이니 참고하면 좋을 것 같다.

 

개발을 하다 보면 날짜를 구해야하는 일들이 많이 있는 것 같아서 한번 정리해둔다.

반응형

+ Recent posts