CODING/스파르타 내일배움캠프 TIL

36_직사각형 별찍기_스탠다드 트랜잭션, 인덱스_숙련 Spring 3주차_25.2.5(수)

codingTrip 2025. 2. 5. 18:41

코트카타

38) 직사각형 별찍기

나의 풀이

import java.util.Scanner;

class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        
        for(int i=0;i<b;i++){
            for(int j=0;j<a;j++){
                System.out.print("*");   
            }
            System.out.println();
        }
    }
}

for문을 사용해서 가로길이만큼 *출력 후 개행했다.

 

다른 분들의 풀이

import java.util.Scanner;
import java.util.stream.IntStream;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();

        StringBuilder sb = new StringBuilder();
        IntStream.range(0, a).forEach(s -> sb.append("*"));
        IntStream.range(0, b).forEach(s -> System.out.println(sb.toString()));
    }
}

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12969/solution_groups?language=java

StringBuilder와 IntStream을 사용하셨다.

나에게는 아직 어색한 개념이다.

 

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        sc.close();

        String row = "*".repeat(a);  // 'a'개의 '*'로 이루어진 문자열 생성
        for (int i = 0; i < b; i++) {
            System.out.println(row);
        }
    }
}

String에는 다양한 메서드가 있는 것 같다.

Java 11부터 사용가능하다고 한다.


스탠다드반 세션

[Spring 5기] 트랜잭션과 인덱스에 대해 알아보자

- 금융에 취업하려면 트랜잭션 관리를 잘해야 함

 

트랜잭션이란 무엇일까?

  • 데이터베이스에서 하나의 논리적인 작업 단위
  • ACID 원칙을 지켜야 함
    • Atomicity(원자성): 하나라도 실패하면 전체가 롤백(All or Nothing)
    • Consistency(일관성): 트랜잭션 실행 전후 데이터가 일관성 유지
    • Isolation(격리성): 트랜잭션끼리 독립적으로 실행(독립(관리하기 진짜 어려움 ex)대용량 트래픽, LOCK))
    • Durability(지속성): 트랜잭션 완료 후 영구적으로 저장(로그, 기록 영구적)

@Transactional

결제, 재무관리 시 촘촘히 나누기

ex) 결제 취소, 에러 발생 시 Rollback 되면 로그 히스토리 날아감

 

@Transactional(readOnly=true)

→ 쓰기 , 수정, 삭제 작업이 차단되거나 무효화됨

읽기 성능이 최적화됨 (중요)

→ JPA 내부에서 변경감지를 하는데, readOnly에서는 비활성화해서 성능 향상

→ 트랜잭션 롤백이 가능은 하지만, 어차피 변경안하죠 큰 의미는 없음

영속성 컨텍스트 (중요 ! 따로 공부할 것)

 

영속성 컨텍스트

Entity 객체를 영속성 상태로 관리하는 일종의 캐시 역할을 하는 공간으로

여기에 저장된 Entity는 데이터베이스와 자동으로 동기화되며

같은 트랜잭션 내에서는 동일한 객체가 유지된다.

 

출처 : 스파르타 강의 자료

 

인덱스는 간단히 개념만!

- full scan 막기 위해 사용

 

- B-Tree

- B+Tree

 

- Full Text - 검색할 때 유용

- Index는 추후 과제할 때 적용해보기

- explain 하면서 속도 개선 등 확인하면서 Index 쓰기

 

인덱스는 튜터님 회사에서 복합인덱스 사용하는 예시 

요런식으로 복합해서 걸어요 괄호 안에가 컬럼들이에요

튜터님 회사에서 복합인덱스 사용하는 예시


숙련 Spring 3주차

boardRepository.findAll() // ① 모든 Board 엔티티 리스트 조회
               .stream() // ② 스트림 변환 (List<Board> → Stream<Board>)
               .map(BoardResponseDto::toDto) // ③ Board 객체를 BoardResponseDto로 변환
               .toList(); // ④ 최종적으로 List<BoardResponseDto> 생성

주요 개념 정리

  1. findAll()
    • JPA의 JpaRepository 메서드로 모든 Board 엔티티를 조회합니다.
    • 반환 타입: List<Board>
  2. .stream()
    • List<Board>를 스트림(Stream<Board>)으로 변환합니다.
  3. .map(BoardResponseDto::toDto)
    • 각 Board 엔티티를 BoardResponseDto로 변환합니다.
    • BoardResponseDto 클래스에 static BoardResponseDto toDto(Board board) 메서드가 있다고 가정합니다.
    • board -> BoardResponseDto.toDto(board)메서드 참조 (::)를 사용하여 축약한 형태입니다.
  4. .toList() (Java 16 이상)
    • 최종적으로 List<BoardResponseDto>를 생성합니다.
    • Java 8에서는 collect(Collectors.toList())를 사용해야 합니다.

 

그래도 직접 손으로 따라치면서 작성해보니 감이 잡히는 것 같다.

물론 내일 발제될 과제 난이도는 강의보다 더 어려울 예정이라

마음의 준비를 하고 오늘을 마무리하고자 한다.