Latest Notes
-
[백준/Java] #17103 골드바흐 파티션
문제 N 미만인 소수 a와 b의 합이 N이 되는 경우의 수를 구해야 하는데, 예제에서 알 수 있듯 a와 b는 같은 수가 될 수 있다. 예를 들면 10 미만의 소수는 {2, 3, 5, 7}이 있고 {3, 7}, {5, 5}의 합이 10이 되므로 골드바흐 파티션의 개수는 2가 된다. 코드 문제를 처음 봤을 때 시간제한 0.5초를 보고 설마 했는데, 역시나 첫 시도는 시간초과가 발생했다. 소수의 합이 N이 되는 경우를 브루트 포스 방식으로 탐색했기 때문이다. 당연한 결과 😂 두 번째 시도는 `LinkedHashSet`에 소수를 저장한 뒤 조건에 맞는 경우만 count를 증가시키는 방법을 사용했다. static LinkedHashSet primes = new LinkedHashSet(); public stati..
-
[Git] 커밋 리셋하기
깃허브의 리드미를 여러 번 수정하다가 커밋 기록이 지저분해 보여서 삭제를 하기로 했다. 커밋 기록을 되돌리는 방법으로는 Revert와 Reset이 있다. Revert: 커밋 취소(revert 기록도 history에 누적) Reset: 커밋 삭제(history까지 제거) 이 포스트에서는 커밋 리셋을 진행해보려고 한다. 커밋 리셋 방법 GitHub Desktop을 이용할 건데, 해당 프로그램을 사용하지 않고 작업을 진행할 리포지토리의 로컬 경로에서 터미널을 실행해도 무방하다. 메뉴의 File > Clone Repository 를 선택한 후 가져올 리포지토리의 url을 입력하면 지정한 경로로 프로젝트가 저장된다. 리포지토리를 가져온 것을 확인하면 Repository > Open in Terminal을 실행한다..
-
[백준/Java] #24511 queuestack - 시간초과 해결
문제 코드 시간 초과 때문에 여러 번 시도한 문제다ㅠㅠ 처음 작성했던 코드는 다음과 같다. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(br.readLine()); StringTokenizer st1 = new StringTokenizer(br.readLine(), " "); StringTokenizer st2 = new StringTokenizer(br.readLine(), " "); ArrayList list = new ArrayList(); for (int i = 0; i < N; i++) { if..
-
[백준/Java] #2346 풍선 터뜨리기 - 메모리 초과 해결 (feat. LinkedList vs ArrayDeque)
문제 코드 처음에 `Deque`을 `LinkedList`로 구현했다가 메모리 초과 문제가 발생했고, `ArrayDeque`으로 바꾸니 바로 풀 수 있었다. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(br.readLine()); Deque d = new ArrayDeque(); int[] arr = new int[N]; StringTokenizer st = new StringTokenizer(br.readLine(), " "); for (int i = 0; i < N; i++) { arr[i] = Int..
-
[JPA] LazyInitializationException 문제 해결하기
에러 내용 org.hibernate.LazyInitializationException: could not initialize proxy [com.hyunrian.project.domain.Member#1] - no Session at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:314) at org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor.intercept(ByteBuddyI..
-
[백준/Java] #13909 창문 닫기 - 메모리 초과 해결
문제 코드 처음에 작성한 코드는 문제에서 말한 그대로 풀이를 한 방식이었는데, 숫자가 커지니 메모리 초과가 발생했다. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); int N = Integer.parseInt(br.readLine()); boolean[] arr = new boolean[N]; for (int i = 1; i
-
프로젝트 중간 점검
개인 프로젝트 설계 - 요구사항과 플로우차트 개인 프로젝트 설계 - DB 설계와 와이어프레임 만들기 프로젝트 방향에 대한 고민 노래방에서 부를 노래에 대한 고민을 해결하기 위한 아이디어에서 출발했던 프로젝트.. 설계를 마치고 코드를 작성하면서 문제가 발생했다. 노래방의 노래 데이터는 공식적으로 제공되는 API가 없어 직접 브랜드별로 데이터를 크롤링하거나 개인이 제공하는 API를 사용해야 한다. 우선 내가 선택한 방법은 API를 사용하는 것이었는데, 응답으로 받는 데이터에는 음악의 앨범 이미지가 없었다. 이건 각 노래방 사이트에서도 제공하지 않는 데이터였기에 여기서 1차 고민에 빠졌다. 1. 이미지 없이 텍스트로만 정보를 제공해야 할까? 하지만 이 방법은 기획 내용과 거리가 있고, 무엇보다 이미지가 없는 ..
-
[백준/Java] #2824 최대공약수
문제 코드 public class Main { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) throws IOException { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); BigInteger a = getValue(); BigInteger b = getValue(); bw.write(gcd(a, b)); bw.close(); } static BigInteger getValue() throws IOException { int N = Integer...
-
개인 프로젝트 설계 - DB 설계와 와이어프레임 만들기
개인 프로젝트 설계 - 요구사항과 플로우차트 ERD 다이어그램 ERD 다이어그램의 초안을 위와 같이 작성했다. 회원 데이터가 들어갈 Member와 노래 데이터를 담을 Music이 메인 테이블이 될 것이다. Album과 Music이 다대다 관계가 될 수밖에 없는데, 이를 방지하고자 SelectedMusic을 두 테이블 사이에 넣어 일대다, 다대일로 풀었다. 아직 추가할지 고민 중인 기능이 있어 나중에 테이블이 변경될 수도 있지만 현재는 이런 상태다. 와이어프레임 Figma로 만든 와이어프레임. 처음 써보는 툴이지만 쉽게 적응할 수 있어 다행이었다. 총 35페이지가 나왔다. 1. 시작페이지 로그인한 회원만 이용할 수 있도록 설계했기 때문에 첫 화면에서 로그인하기, 가입하기를 선택한다. 유효성 검사를 이후 이..
-
[백준/Java] #10816 숫자 카드 2 - 시간초과 문제 해결
문제 코드 처음 시도했을 때 시간 초과로 실패했다. import java.io.*; import java.util.stream.Stream; 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.valueOf(br.readLine()); int[] nums = getNums(n, br); int m = Integer.valu..
-
[백준/Java] #1929 소수 구하기 - 시간초과 문제 해결
문제 코드 처음 작성했던 코드는 판별할 숫자를 2부터 증가하는 정수의 배수일 경우 소수가 아닌 것으로 판단하는 단순한 코드였다. 소수 여부를 판별하는 것은 어렵지 않지만, 계속해서 시간초과가 뜨는 바람에 다른 방식을 생각해야 했다. import java.io.*; 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)); String[] s = br.read..
-
[JPA] 상속관계 매핑하기
슈퍼타입과 서브타입 객체 지향 프로그래밍에는 클래스 간의 상속관계가 있지만, 데이터베이스에는 상속의 개념이 없다. 하지만 슈퍼타입(super type)과 서브타입(sub type)의 모델링 기법이 객체 상속과 유사한 개념을 가진다. 슈퍼타입: 여러 서브타입의 공통 특성을 가지고 있는 엔티티 서브타입: 슈퍼타입의 특성을 상속받은 엔티티 여러 서브타입이 하나의 슈퍼타입을 가질 수 있으며, 각 서브타입은 슈퍼타입에서 정의된 속성 외에도 고유한 속성을 가질 수 있다. 이런 식으로 엔티티 클래스 간의 상속 관계를 설정하면 여러 가지 장점이 있다. 부모 클래스에서 정의한 속성과 메서드를 자식 클래스에서 재사용할 수 있다. 공통된 속성을 하나의 부모 클래스에 정의함으로써 데이터 일관성을 유지할 수 있다. 상속을 통해..
-
[H2] Column "start_value" not found 오류 해결
오류 내용 및 발생 상황 Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "start_value" not found [42122-214] Entity를 생성하면서 @Inheritance 옵션을 변경했더니 위와 같은 오류가 발생하였다. 사용 중인 버전은 다음과 같다. Spring Boot 3.2.2 Hibernate 6.4.2 H2 2.2.224 해결 방법 찾아보니 H2의 버전이 맞지 않으면 발생하는 오류라고 한다. 이상하게도 나는 H2를 2.2.224 버전 외에 설치한 적이 없는데, H2 콘솔에 `select h2version() from dual;`을 입력해 버전을 확인해 봤더니 1.4.200이 뜨는 것이 아닌가..? 근데 저렇게 입력하지 않아도..
-
개인 프로젝트 설계 - 요구사항과 플로우차트
프로젝트 시작(잡담을 곁들인) 첫 번째 프로젝트가 끝나고 생각보다 시간이 꽤 흘렀다. 몇 달간 프로젝트에 대한 아이디어는 계속 생각해 왔는데 이제야 시작하게 되었다. 이렇게 미뤄진 이유는 내가 모르는 것들이 너무나 많다고 느꼈고, 새로운 기술을 적용한 프로젝트를 해보고 싶었기 때문이다. 나의 첫 프로젝트는 부산 여행 정보 웹사이트 개발로, 부산 여행에 필요한 다양한 정보들을 제공하고 유저 간 후기를 공유하는 것을 목적으로 하며 Spring과 MyBatis, JSP를 사용하였다. 프로젝트 당시에는 MyBatis가 구체적으로 뭔지도 잘 몰랐고, 그저 JDBC를 더 수월하게 사용할 수 있는 방법인 줄만 알았으며 MyBatis보다 더 나아간 기술이 있는지조차 알지 못했다. 교육과정을 수료한 이후로는 혼자서 공부..
-
Domain Model Pattern과 Transaction Script Pattern
소프트웨어 개발에서 아키텍처 패턴은 애플리케이션의 설계와 구조를 결정하는 데 중요한 역할을 한다. 이번 글에서는 두 가지 주요한 아키텍처 패턴인 도메인 모델 패턴(Domain Model Pattern)과 트랜잭션 스크립트 패턴(Transaction Script Pattern)에 대해 간단하게 알아보고자 한다. 도메인 모델 패턴 도메인 모델 패턴은 소프트웨어 시스템의 핵심 개념을 모델링하는 방법론으로, 시스템의 복잡한 비즈니스 로직을 객체 지향적인 방식으로 모델링하여 구현한다. Entity, Service, Repository 등의 요소를 사용하여 비즈니스 도메인을 표현하는데, Spring Framework의 Spring Data JPA와 같은 ORM 기술을 사용할 때 적용하기 좋은 패턴이다. Spring..
-
Terminal에서 ll 사용하기: command not found
ll은 해당 디렉토리 내 파일 목록을 상세히 볼 수 있는 명령어이다. Mac OS의 Terminal에서 사용하려고 하면 command not found가 뜨기 때문에 별도의 설정이 필요하다. 설정 방법 alias를 다음과 같이 설정한다. echo "alias ll='ls -lGaf'" >> ~/.bash_profile source ~/.bash_profile 하지만 이렇게 설정하면 새로운 탭에서 사용하거나, 종료 후 재실행했을 때는 다시 적용 전 상태로 돌아가있기 때문에 Terminal이 실행될 때마다 적용되도록 하는 설정이 추가로 필요하다. echo "source ~/.bash_profile" >> ~/.zshrc 이제 항상 ll 명령어를 사용할 수 있다. 참고 [Linux] zsh: command n..
-
Spring Annotation 정리
스프링에서는 편의를 위해 제공하는 다양한 애너테이션이 있는데, 그중에서 자주 사용되는 애너테이션을 정리해보고자 한다. 각 애너테이션이 하는 역할을 간단하게 설명할 것이며 지속적으로 업데이트할 예정이다. 스프링 기본 애너테이션뿐만 아니라 자주 사용되는 라이브러리의 애너테이션도 포함한다. Spring MVC `@Controller` 클래스에 적용하면 해당 클래스가 컨트롤러로 사용됨 사용자의 요청을 처리하고 Model을 만들어 View에 전달하는 역할을 수행함 @Controller public class MyController { @GetMapping("/hello") public String helloWorld() { return "hello"; //hello.html } } `@RestController`..
-
[Spring Boot] MessageSource - 오류 메시지 처리 방식
개요 며칠 전 검증 결과로 에러 메시지를 확인하는 과정에서 API를 사용했을 때 errors.properties를 통해 설정한 메시지가 아닌 디폴트 메시지로 나오는 것을 발견했다. 오류 메시지를 처리하는 과정이 각각의 응답 방식(타임리프와 Json 등)에 차이가 있기 때문이었다. 이번 포스트에서는 이전 글에 이어서 스프링이 오류 메시지를 처리하는 방식에 대해 간단히 알아보고자 한다. 이전글: https://hyunrian.tistory.com/84 Bean Validation - 검증 기능 사용 방법 Bean Validation이란? 회원가입 등 특정 필드에 대한 검증 로직을 모든 프로젝트에 적용할 수 있도록 표준화 한 것으로, 애너테이션을 사용하여 쉽게 검증 기능을 구현할 수 있다. 여기에서 다양한 h..
-
Mac에서 H2 설치 및 실행하기
H2 Database는 간단한 개발이나 테스트 용도로 사용하기 좋은 DB이다. 이번 글에서는 맥에서 H2를 설치하고 실행하는 과정을 진행해보려 한다. H2 설치하기 아래의 링크로 들어가면 최신 버전을 OS에 맞게 다운로드할 수 있다. https://www.h2database.com/html/main.html H2 Database Engine H2 Database Engine Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; in-memory databases Browser based Console application Small ..
-
[Spring Boot] Embeded Mode로 테스트 하기 (feat. H2 Database)
H2 데이터베이스의 두 가지 모드 H2 데이터베이스는 서버 모드(Server Mode)와 내장 모드(Embeded Mode) 중 하나로 선택하여 사용할 수 있다. 그중 Embeded 모드는 H2 DB를 애플리케이션 내부에 포함시켜 사용하는 모드로, 애플리케이션과 함께 실행되는 내장 데이터베이스로 활용된다. 애플리케이션이 종료되면 Embeded 모드로 동작하는 H2 DB도 함께 종료되고, 데이터도 함께 사라진다. Embeded 모드를 사용하면 별도의 서버 프로세스를 실행할 필요가 없고, DB 파일이나 인메모리 DB를 사용하여 간단하게 데이터를 저장하거나 검색할 수 있다. 테스트의 필요성과 고려사항 소프트웨어 개발에서 테스트는 매우 중요한 단계다. 코드에서 발생할 수 있는 버그를 조기에 발견하여 수정할 수 ..
-
Name for argument of type [java.lang.Integer] not specified (+ 프로젝트 실행 오류와 파라미터 인식 문제 해결)
Name for argument of type [java.lang.Integer] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag. IntelliJ에서 Converter 테스트 중 발생한 오류 환경 및 버전: Mac OS, IntelliJ IDEA, Java 17, Spring Boot 3.2.1 서버 실행하여 맵핑한 url로 데이터를 넘기는데 파라미터를 제대로 인식하지 못한 것으로 보임 -> 매개변수 이름 인식 문제 오류 내용 Name for argument of type [java.lang.Integer] not spec..
-
Java의 예외 - Checked 예외와 Unchecked 예외
프로그램의 오류 프로그램의 실행 중 오작동 또는 비정상적 종료를 야기하는 원인을 프로그램 에러 또는 오류라고 한다. 이는 발생 시점에 따라 컴파일 에러와 런타임 에러로 나눌 수 있다. 컴파일 에러: 컴파일 시 발생하는 에러 런타임 에러: 실행 시 발생하는 에러 코드의 오타나 잘못된 구문 등 기본적인 검사를 컴파일 시 수행하여 오류가 있으면 컴파일이 실행되지 않는데, 이것이 컴파일 에러다. 물론 컴파일을 성공적으로 마쳐도 프로그램이 실행되는 도중 발생할 수 있는 오류가 있고 이것을 런타임 에러라 하며, 크게 Error와 Exception 두 가지로 분류할 수 있다. 에러(Error): 프로그램 코드에 의해 수습될 수 없는 심각한 오류 예외(Exception): 프로그램 코드에 의해 수습될 수 있는 다소 미..
-
[Spring Boot] Bean Validation - 검증 기능 사용 방법
Bean Validation이란? 회원가입 등 특정 필드에 대한 검증 로직을 모든 프로젝트에 적용할 수 있도록 표준화 한 것으로, 애너테이션을 사용하여 쉽게 검증 기능을 구현할 수 있다. 여기에서 다양한 검증 애너테이션의 종류와 설명을 볼 수 있다. Bean Validation 사용 방법 1. 의존관계 추가 Bean Validation을 사용하려면 우선 build.gradle에 의존관계를 추가해야 한다. 추가 후 refresh하는 것도 잊지 않도록 한다. implementation 'org.springframework.boot:spring-boot-starter-validation' 2. 적용 의존관계를 추가하면 @NotNull, @Range 등 검증과 관련된 애너테이션을 사용할 수 있다. 테스트용으로 ..
-
데이터 접근 기술 (6) - Querydsl
개요 이번 글은 데이터 접근 기술 시리즈의 마지막으로, Querydsl에 대한 글이다. 김영한 님의 스프링 DB 강의와 개인 공부를 통해 학습한 내용을 정리하고자 한다. Spring Boot 3.2.2, JDK 17 버전이며 H2를 데이터베이스로 사용하니 참고하자. 데이터 접근 기술 (1) - 데이터 접근 기술의 종류 데이터 접근 기술 (2) - JdbcTemplate 데이터 접근 기술 (3) - MyBatis 데이터 접근 기술 (4) - JPA 데이터 접근 기술 (5) - Spring Data JPA 데이터 접근 기술 (6) - Querydsl Querydsl이란? Querydsl(Queryable Domain Specific Language)은 자바 기반의 오픈 소스 라이브러리로, 타입 안정성을 갖는..
-
데이터 접근 기술 (5) - Spring Data JPA
개요 이번 글은 데이터 접근 기술 시리즈의 다섯 번째로, Spring Data JPA에 대한 글이다. 김영한 님의 스프링 DB 강의와 개인 공부를 통해 학습한 내용을 정리하고자 한다. Spring Boot 3.2.2, JDK 17 버전이며 H2를 데이터베이스로 사용하니 참고하자. 데이터 접근 기술 (1) - 데이터 접근 기술의 종류 데이터 접근 기술 (2) - JdbcTemplate 데이터 접근 기술 (3) - MyBatis 데이터 접근 기술 (4) - JPA 데이터 접근 기술 (5) - Spring Data JPA 데이터 접근 기술 (6) - Querydsl Spring Data JPA란? Spring Data JPA는 스프링 프레임워크가 제공하는 라이브러리로, JPA를 더욱 편리하게 사용할 수 있도록..
-
[Spring Boot] PermittedSubclasses requires ASM9 에러
에러 내용 PermittedSubclasses requires ASM9 발생 상황 Spring Boot 외부 소스 코드를 다운 받아 실행하는데 버전이 맞지 않아 JDK 17 기준으로 설정을 바꾸었고(변경 전 11) 정상적으로 실행되는 것을 확인했다. 이후 h2 db와 연동하기 위해 build.gradle에 설정을 추가하는 중 에러가 발생했다. 문제 해결 버전 업그레이드를 위해 Settings와 build.gradle에서만 설정을 해줬는데 한가지 설정이 더 필요했다. /gradle/wrapper/gradle-wrapper.properties에서 gradle의 버전을 7.6으로 변경한다. 버전을 변경하면 해당 버전에 맞게 다운로드가 진행된다. 다시 실행해보면 정상적으로 실행되는 것을 확인할 수 있다.
-
Session에 대해서 - 컨트롤러에서 HttpSession 사용하기
Spring MVC - HttpSession HttpSession은 서블릿이 제공하는 일종의 쿠키로, `Cookie : JSESSIONID=3LKSAJFKJ20298349028SD9F0`과 같이 랜덤값으로 설정되며 주로 로그인 처리를 위해 사용한다. 세션에 로그인한 사용자의 정보를 넣어두고 사용하는 것이다. 컨트롤러에서 세션 사용하기 1. 세션에 값 담기 컨트롤러의 파라미터로 `HttpServletRequest`를 받아 `request.getSession()`으로 세션을 생성할 수 있다. @PostMapping("/login") public String login(@ModelAttribute User user, HttpServletRequest request) { (검증 로직 생략) HttpSession..
-
데이터 접근 기술 (4) - JPA
개요 이번 글은 데이터 접근 기술 시리즈의 네 번째로, JPA에 대한 글이다. 김영한 님의 스프링 DB 강의와 개인 공부를 통해 학습한 내용을 정리하고자 한다. Spring Boot 3.2.2, JDK 17 버전이며 H2를 데이터베이스로 사용하니 참고하자. 데이터 접근 기술 (1) - 데이터 접근 기술의 종류 데이터 접근 기술 (2) - JdbcTemplate 데이터 접근 기술 (3) - MyBatis 데이터 접근 기술 (4) - JPA 데이터 접근 기술 (5) - Spring Data JPA 데이터 접근 기술 (6) - Querydsl JPA란? JPA(Java Persistence API)는 자바 어플리케이션에서 관계형 데이터베이스를 다루기 위한 표준 인터페이스이다. 객체와 관계형 데이터베이스 간의 ..
Programming
-
[Git] 커밋 리셋하기
깃허브의 리드미를 여러 번 수정하다가 커밋 기록이 지저분해 보여서 삭제를 하기로 했다. 커밋 기록을 되돌리는 방법으로는 Revert와 Reset이 있다. Revert: 커밋 취소(revert 기록도 history에 누적) Reset: 커밋 삭제(history까지 제거) 이 포스트에서는 커밋 리셋을 진행해보려고 한다. 커밋 리셋 방법 GitHub Desktop을 이용할 건데, 해당 프로그램을 사용하지 않고 작업을 진행할 리포지토리의 로컬 경로에서 터미널을 실행해도 무방하다. 메뉴의 File > Clone Repository 를 선택한 후 가져올 리포지토리의 url을 입력하면 지정한 경로로 프로젝트가 저장된다. 리포지토리를 가져온 것을 확인하면 Repository > Open in Terminal을 실행한다..
-
[JPA] LazyInitializationException 문제 해결하기
에러 내용 org.hibernate.LazyInitializationException: could not initialize proxy [com.hyunrian.project.domain.Member#1] - no Session at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:314) at org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor.intercept(ByteBuddyI..
-
[JPA] 상속관계 매핑하기
슈퍼타입과 서브타입 객체 지향 프로그래밍에는 클래스 간의 상속관계가 있지만, 데이터베이스에는 상속의 개념이 없다. 하지만 슈퍼타입(super type)과 서브타입(sub type)의 모델링 기법이 객체 상속과 유사한 개념을 가진다. 슈퍼타입: 여러 서브타입의 공통 특성을 가지고 있는 엔티티 서브타입: 슈퍼타입의 특성을 상속받은 엔티티 여러 서브타입이 하나의 슈퍼타입을 가질 수 있으며, 각 서브타입은 슈퍼타입에서 정의된 속성 외에도 고유한 속성을 가질 수 있다. 이런 식으로 엔티티 클래스 간의 상속 관계를 설정하면 여러 가지 장점이 있다. 부모 클래스에서 정의한 속성과 메서드를 자식 클래스에서 재사용할 수 있다. 공통된 속성을 하나의 부모 클래스에 정의함으로써 데이터 일관성을 유지할 수 있다. 상속을 통해..
-
[H2] Column "start_value" not found 오류 해결
오류 내용 및 발생 상황 Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "start_value" not found [42122-214] Entity를 생성하면서 @Inheritance 옵션을 변경했더니 위와 같은 오류가 발생하였다. 사용 중인 버전은 다음과 같다. Spring Boot 3.2.2 Hibernate 6.4.2 H2 2.2.224 해결 방법 찾아보니 H2의 버전이 맞지 않으면 발생하는 오류라고 한다. 이상하게도 나는 H2를 2.2.224 버전 외에 설치한 적이 없는데, H2 콘솔에 `select h2version() from dual;`을 입력해 버전을 확인해 봤더니 1.4.200이 뜨는 것이 아닌가..? 근데 저렇게 입력하지 않아도..
-
Terminal에서 ll 사용하기: command not found
ll은 해당 디렉토리 내 파일 목록을 상세히 볼 수 있는 명령어이다. Mac OS의 Terminal에서 사용하려고 하면 command not found가 뜨기 때문에 별도의 설정이 필요하다. 설정 방법 alias를 다음과 같이 설정한다. echo "alias ll='ls -lGaf'" >> ~/.bash_profile source ~/.bash_profile 하지만 이렇게 설정하면 새로운 탭에서 사용하거나, 종료 후 재실행했을 때는 다시 적용 전 상태로 돌아가있기 때문에 Terminal이 실행될 때마다 적용되도록 하는 설정이 추가로 필요하다. echo "source ~/.bash_profile" >> ~/.zshrc 이제 항상 ll 명령어를 사용할 수 있다. 참고 [Linux] zsh: command n..
-
Spring Annotation 정리
스프링에서는 편의를 위해 제공하는 다양한 애너테이션이 있는데, 그중에서 자주 사용되는 애너테이션을 정리해보고자 한다. 각 애너테이션이 하는 역할을 간단하게 설명할 것이며 지속적으로 업데이트할 예정이다. 스프링 기본 애너테이션뿐만 아니라 자주 사용되는 라이브러리의 애너테이션도 포함한다. Spring MVC `@Controller` 클래스에 적용하면 해당 클래스가 컨트롤러로 사용됨 사용자의 요청을 처리하고 Model을 만들어 View에 전달하는 역할을 수행함 @Controller public class MyController { @GetMapping("/hello") public String helloWorld() { return "hello"; //hello.html } } `@RestController`..
-
[Spring Boot] MessageSource - 오류 메시지 처리 방식
개요 며칠 전 검증 결과로 에러 메시지를 확인하는 과정에서 API를 사용했을 때 errors.properties를 통해 설정한 메시지가 아닌 디폴트 메시지로 나오는 것을 발견했다. 오류 메시지를 처리하는 과정이 각각의 응답 방식(타임리프와 Json 등)에 차이가 있기 때문이었다. 이번 포스트에서는 이전 글에 이어서 스프링이 오류 메시지를 처리하는 방식에 대해 간단히 알아보고자 한다. 이전글: https://hyunrian.tistory.com/84 Bean Validation - 검증 기능 사용 방법 Bean Validation이란? 회원가입 등 특정 필드에 대한 검증 로직을 모든 프로젝트에 적용할 수 있도록 표준화 한 것으로, 애너테이션을 사용하여 쉽게 검증 기능을 구현할 수 있다. 여기에서 다양한 h..
-
[Spring Boot] Embeded Mode로 테스트 하기 (feat. H2 Database)
H2 데이터베이스의 두 가지 모드 H2 데이터베이스는 서버 모드(Server Mode)와 내장 모드(Embeded Mode) 중 하나로 선택하여 사용할 수 있다. 그중 Embeded 모드는 H2 DB를 애플리케이션 내부에 포함시켜 사용하는 모드로, 애플리케이션과 함께 실행되는 내장 데이터베이스로 활용된다. 애플리케이션이 종료되면 Embeded 모드로 동작하는 H2 DB도 함께 종료되고, 데이터도 함께 사라진다. Embeded 모드를 사용하면 별도의 서버 프로세스를 실행할 필요가 없고, DB 파일이나 인메모리 DB를 사용하여 간단하게 데이터를 저장하거나 검색할 수 있다. 테스트의 필요성과 고려사항 소프트웨어 개발에서 테스트는 매우 중요한 단계다. 코드에서 발생할 수 있는 버그를 조기에 발견하여 수정할 수 ..
-
Name for argument of type [java.lang.Integer] not specified (+ 프로젝트 실행 오류와 파라미터 인식 문제 해결)
Name for argument of type [java.lang.Integer] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag. IntelliJ에서 Converter 테스트 중 발생한 오류 환경 및 버전: Mac OS, IntelliJ IDEA, Java 17, Spring Boot 3.2.1 서버 실행하여 맵핑한 url로 데이터를 넘기는데 파라미터를 제대로 인식하지 못한 것으로 보임 -> 매개변수 이름 인식 문제 오류 내용 Name for argument of type [java.lang.Integer] not spec..
-
Java의 예외 - Checked 예외와 Unchecked 예외
프로그램의 오류 프로그램의 실행 중 오작동 또는 비정상적 종료를 야기하는 원인을 프로그램 에러 또는 오류라고 한다. 이는 발생 시점에 따라 컴파일 에러와 런타임 에러로 나눌 수 있다. 컴파일 에러: 컴파일 시 발생하는 에러 런타임 에러: 실행 시 발생하는 에러 코드의 오타나 잘못된 구문 등 기본적인 검사를 컴파일 시 수행하여 오류가 있으면 컴파일이 실행되지 않는데, 이것이 컴파일 에러다. 물론 컴파일을 성공적으로 마쳐도 프로그램이 실행되는 도중 발생할 수 있는 오류가 있고 이것을 런타임 에러라 하며, 크게 Error와 Exception 두 가지로 분류할 수 있다. 에러(Error): 프로그램 코드에 의해 수습될 수 없는 심각한 오류 예외(Exception): 프로그램 코드에 의해 수습될 수 있는 다소 미..
-
[Spring Boot] Bean Validation - 검증 기능 사용 방법
Bean Validation이란? 회원가입 등 특정 필드에 대한 검증 로직을 모든 프로젝트에 적용할 수 있도록 표준화 한 것으로, 애너테이션을 사용하여 쉽게 검증 기능을 구현할 수 있다. 여기에서 다양한 검증 애너테이션의 종류와 설명을 볼 수 있다. Bean Validation 사용 방법 1. 의존관계 추가 Bean Validation을 사용하려면 우선 build.gradle에 의존관계를 추가해야 한다. 추가 후 refresh하는 것도 잊지 않도록 한다. implementation 'org.springframework.boot:spring-boot-starter-validation' 2. 적용 의존관계를 추가하면 @NotNull, @Range 등 검증과 관련된 애너테이션을 사용할 수 있다. 테스트용으로 ..
-
[Spring Boot] PermittedSubclasses requires ASM9 에러
에러 내용 PermittedSubclasses requires ASM9 발생 상황 Spring Boot 외부 소스 코드를 다운 받아 실행하는데 버전이 맞지 않아 JDK 17 기준으로 설정을 바꾸었고(변경 전 11) 정상적으로 실행되는 것을 확인했다. 이후 h2 db와 연동하기 위해 build.gradle에 설정을 추가하는 중 에러가 발생했다. 문제 해결 버전 업그레이드를 위해 Settings와 build.gradle에서만 설정을 해줬는데 한가지 설정이 더 필요했다. /gradle/wrapper/gradle-wrapper.properties에서 gradle의 버전을 7.6으로 변경한다. 버전을 변경하면 해당 버전에 맞게 다운로드가 진행된다. 다시 실행해보면 정상적으로 실행되는 것을 확인할 수 있다.
-
Session에 대해서 - 컨트롤러에서 HttpSession 사용하기
Spring MVC - HttpSession HttpSession은 서블릿이 제공하는 일종의 쿠키로, `Cookie : JSESSIONID=3LKSAJFKJ20298349028SD9F0`과 같이 랜덤값으로 설정되며 주로 로그인 처리를 위해 사용한다. 세션에 로그인한 사용자의 정보를 넣어두고 사용하는 것이다. 컨트롤러에서 세션 사용하기 1. 세션에 값 담기 컨트롤러의 파라미터로 `HttpServletRequest`를 받아 `request.getSession()`으로 세션을 생성할 수 있다. @PostMapping("/login") public String login(@ModelAttribute User user, HttpServletRequest request) { (검증 로직 생략) HttpSession..
-
객체 지향 설계의 5가지 원칙 - SOLID
SOLID란? 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙으로 시간이 지나도 유지 보수와 확장이 용이한 시스템을 만들 때 적용한다. 애자일 소프트웨어 개발과 적응적 소프트웨어 개발의 전반적 전략에 속한다. SRP, OCP, LSP, ISP, DIP의 앞 문자를 따서 SOLID라 칭한다. S(SRP) 단일 책임 원칙(Single Responsibility Principle) 한 클래스는 하나의 책임만 가져야 함 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것이라 할 수 있음 다른 객체 지향 원리를 적용하는 기초 ex) UI 변경, 객체의 생성과 사용 등 각각의 역할과 기능 분리 O(OCP) 개방-폐쇄 원칙(Open/Closed Principle) 소프트웨어 요소는 확장에는 열려 ..
-
Java HotSpot(TM) 64-Bit Server VM warning 해결
에러 내용 Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended IntelliJ에서 프로젝트를 실행하면 계속 발생했다. 심지어 항상 뜬다기보다는 어떤 프로젝트에서는 계속 뜨다가 새 프로젝트에서는 안 뜨기도 하고..? 검색해 보니 에러라기보다는 경고 메시지로 실제 실행하고 동작하는 데에는 문제가 없다고 하지만 그냥 저 메시지 자체가 뜨지 않았으면 했다. 해결 방법 많은 사람들이 Settings > Build, Execution, Deployment > Debugger > Async Stack Traces에서 Ins..
Project
-
프로젝트 중간 점검
개인 프로젝트 설계 - 요구사항과 플로우차트 개인 프로젝트 설계 - DB 설계와 와이어프레임 만들기 프로젝트 방향에 대한 고민 노래방에서 부를 노래에 대한 고민을 해결하기 위한 아이디어에서 출발했던 프로젝트.. 설계를 마치고 코드를 작성하면서 문제가 발생했다. 노래방의 노래 데이터는 공식적으로 제공되는 API가 없어 직접 브랜드별로 데이터를 크롤링하거나 개인이 제공하는 API를 사용해야 한다. 우선 내가 선택한 방법은 API를 사용하는 것이었는데, 응답으로 받는 데이터에는 음악의 앨범 이미지가 없었다. 이건 각 노래방 사이트에서도 제공하지 않는 데이터였기에 여기서 1차 고민에 빠졌다. 1. 이미지 없이 텍스트로만 정보를 제공해야 할까? 하지만 이 방법은 기획 내용과 거리가 있고, 무엇보다 이미지가 없는 ..
-
개인 프로젝트 설계 - DB 설계와 와이어프레임 만들기
개인 프로젝트 설계 - 요구사항과 플로우차트 ERD 다이어그램 ERD 다이어그램의 초안을 위와 같이 작성했다. 회원 데이터가 들어갈 Member와 노래 데이터를 담을 Music이 메인 테이블이 될 것이다. Album과 Music이 다대다 관계가 될 수밖에 없는데, 이를 방지하고자 SelectedMusic을 두 테이블 사이에 넣어 일대다, 다대일로 풀었다. 아직 추가할지 고민 중인 기능이 있어 나중에 테이블이 변경될 수도 있지만 현재는 이런 상태다. 와이어프레임 Figma로 만든 와이어프레임. 처음 써보는 툴이지만 쉽게 적응할 수 있어 다행이었다. 총 35페이지가 나왔다. 1. 시작페이지 로그인한 회원만 이용할 수 있도록 설계했기 때문에 첫 화면에서 로그인하기, 가입하기를 선택한다. 유효성 검사를 이후 이..
-
개인 프로젝트 설계 - 요구사항과 플로우차트
프로젝트 시작(잡담을 곁들인) 첫 번째 프로젝트가 끝나고 생각보다 시간이 꽤 흘렀다. 몇 달간 프로젝트에 대한 아이디어는 계속 생각해 왔는데 이제야 시작하게 되었다. 이렇게 미뤄진 이유는 내가 모르는 것들이 너무나 많다고 느꼈고, 새로운 기술을 적용한 프로젝트를 해보고 싶었기 때문이다. 나의 첫 프로젝트는 부산 여행 정보 웹사이트 개발로, 부산 여행에 필요한 다양한 정보들을 제공하고 유저 간 후기를 공유하는 것을 목적으로 하며 Spring과 MyBatis, JSP를 사용하였다. 프로젝트 당시에는 MyBatis가 구체적으로 뭔지도 잘 몰랐고, 그저 JDBC를 더 수월하게 사용할 수 있는 방법인 줄만 알았으며 MyBatis보다 더 나아간 기술이 있는지조차 알지 못했다. 교육과정을 수료한 이후로는 혼자서 공부..
-
첫 프로젝트 기록 - 팀 프로젝트 회고
첫 프로젝트 기록 - 팀 프로젝트 기획 (1) 첫 프로젝트 기록 - 팀 프로젝트 기획 (2) 첫 프로젝트 기록 - 팀 프로젝트 중간점검 첫 프로젝트 기록 - 팀 프로젝트 회고 8월 25일로 약 4주 간의 팀 프로젝트가 끝났다. 3주 정도 기획+개발을 하고 마지막 주는 거의 발표 준비를 했으니 사실상 3주라고 봐야할까? 어쨌든 4개월 간 배운 것들을 녹여 객체 지향적인 코딩, API 활용, 사용자 친화적 설계가 목표였다. 첫 번째 프로젝트라 부족한 점이 많았고, 프로젝트가 끝난 지금 아쉬운 점도 분명 많지만 주어진 기간 내 진심으로 최선을 다했다고는 말할 수 있다. 그래서 후회는 없다. 담당 파트 총 4명으로 구성된 팀이었는데, 각자 맡은 기능의 프론트와 백을 했다. 내가 전체 프로젝트 중에서 맡은 역할은..
-
첫 프로젝트 기록 - 팀 프로젝트 중간점검
첫 프로젝트 기록 - 팀 프로젝트 기획 (1) 첫 프로젝트 기록 - 팀 프로젝트 기획 (2) 첫 프로젝트 기록 - 팀 프로젝트 중간점검 첫 프로젝트 기록 - 팀 프로젝트 회고 눈 뜨고 감을 때까지 프로젝트로 가득 찬 나날을 보내고 있다.🥹 너무 정신이 없어 긴 글을 적을 순 없고, 그냥 지금까지의 진행 상황을 간단하게 적어보고자 한다. 🚀 발생한 이슈들 gitignore 파일을 작성하여 커밋했는데, 제외되어야 할 파일이 포함되어 있는 바람에 팀원들이 push 할 때 오류가 발생했다. `.project`와 `.classpath`를 포함하도록 gitignore 수정 수정 후에도 수정한 내용이 반영되지 않아 오류가 해결되지 않음 git의 캐시 문제 아래 명령어로 캐시 전체 삭제 후 다시 커밋함 git rm ..
-
첫 프로젝트 기록 - 팀 프로젝트 기획 (2)
첫 프로젝트 기록 - 팀 프로젝트 기획 (1) 첫 프로젝트 기록 - 팀 프로젝트 기획 (2) 첫 프로젝트 기록 - 팀 프로젝트 중간점검 첫 프로젝트 기록 - 팀 프로젝트 회고 아이디어 회의 때 결정한 내용을 바탕으로 일주일 간 프로젝트 설계를 진행하였다. 첫 번째 회의가 끝나고 집에 돌아가서 팀원들이 조사한 내용을 공유할 수 있도록 구글 스프레드 시트를 만드는 것부터 시작하였다. 그리고 또 다른 협업 툴로 노션을 이용했는데, 노션에는 프로젝트 요구사항과 일정 관리 등을 중점적으로 작성했다. 노션에 작성한 내용은 다음과 같다. 코드 작성 원칙 프로젝트 개요 업무 분담 테이블 설계 참고자료 협업 툴 링크(스프레드 시트, 디스코드) 프로젝트 타임라인 코드 작성 원칙: 요구사항, 네이밍 규칙, Git 관련 규칙..
-
첫 프로젝트 기록 - 팀 프로젝트 기획 (1)
첫 프로젝트 기록 - 팀 프로젝트 기획 (1) 첫 프로젝트 기록 - 팀 프로젝트 기획 (2) 첫 프로젝트 기록 - 팀 프로젝트 중간점검 첫 프로젝트 기록 - 팀 프로젝트 회고 드디어 프로젝트를 시작하게 되었다. 각자 3일 간 아이디어를 생각해 보는 시간을 가졌고 오늘 첫 회의를 했다. 걱정이 무색하게 팀원들이 다양한 아이디어를 가지고 왔는데 주제 선정이 아쉽거나 데이터 활용이 어려울 듯한 이유로 내가 구상한 아이디어인 여행 정보 웹사이트를 하기로 결정했다. 처음엔 다소 아이템 선정에 의견 충돌이 있었지만(관심 있는 분야가 아니라는 점에서) 결국 제일 중요한 건 기능을 어떻게 구현하느냐라는 점에 모두가 동의했고, 사전 자료 조사 내용을 보고 이보다 더 좋게 나오긴 힘들겠다는 판단을 내려 의견을 모을 수 있..
Daily Record
-
2023년 정보처리기사 필기 시험 후기
시작 합격자 발표는 8월 2일에 났지만 프로젝트 기간이라 정신이 없어서 이제야 써보는 정처기 필기 후기 😂 이런 종류의 자격증 시험을 한번도 본 적이 없어 시험 공부 전 후기 검색을 많이 했기 때문에 누군가에게 조금이라도 도움이 될까 싶어 간략하게 남겨본다. 우선 결과부터 얘기하자면 평균 91점으로 합격했다 ✌🏻 일정 전체 일정은 시험 접수기간(6/19~22) -> 필기시험(7/8~23) -> 합격자 발표(8/2) 이렇게 진행이 되었고 나는 7월 9일에 시험을 쳤다. 시험을 빨리 본 이유는 사람들이 어찌나 빠르게 접수를 하던지 자리가 많지 않기도 했고 그냥 주차가 편한 곳으로 접수했다. 기간이 넉넉해봤자 내가 그만큼 공부를 계속 할 것 같지도 않았고..? 까먹을 것 같기도 하고 금토 빡세게 하고 일요일에..
-
7월 2주차 학습 내용 정리
Spring - RedirectAttributes, Responsebody @Controller public class SampleController4 { // localhost/doE -> localhost/doF로 redirect -> doF.jsp로 forward @RequestMapping(value = "/doE", method = RequestMethod.GET) public String doE(RedirectAttributes rttr) { rttr.addFlashAttribute("msg", "hello"); // 게시판 실습 때 Controller에서 session.setAttribute("msg", "hello") // -> View에서 session.removeAttribute("ms..
-
7월 1주차 학습 내용 정리
Web - 회원정보 CRUD 기능 구현(Model2) - MemberVo.java public class MemberVo { private String id, pwd, name, email; private Date joindate; public MemberVo() { super(); } public MemberVo(String id, String pwd, String name, String email) { super(); this.id = id; this.pwd = pwd; this.name = name; this.email = email; } public MemberVo(String id, String pwd, String name, String email, Date joindate) { super()..
-
6월 4주차 학습 내용 정리
Web - 표현언어와 JSTL 1. 표현언어(EL, Expression Language) - 자바 코드가 들어가는 표현식을 좀 더 편리하게 사용하기 위해 도입된 데이터 출력 기능 - 표현식의 자바 코드()가 복잡해지면서 자바 코드로 출력하는 표현식을 대체하기 위해 등장함 - 표현언어의 특징 * 기존 표현식보다 편리하게 값 출력 가능 * 변수와 여러가지 연산자 포함 가능 * jsp의 내장 객체에 저장된 속성 및 자바의 빈 속성도 표현 언어에서 출력 가능 * java에서 사용하는 산술/비교/논리/조건 연산자와 동일하게 사용 가능하며 몇가지 연산자를 제외하면 문자로 된 연산자도 사용 가능함 ex) eq(==), ne(!=), and(&&) 등 - ${표현식 or 값}의 형태로 사용 \${100} : ${100..
-
6월 3주차 학습 내용 정리
Web Programming 1. Web Application - 기존의 정적인 웹 애플리케이션의 기능을 그대로 사용하면서 서블릿, JSP, 자바 클래스들을 추가하여 사용자에게 동적인 서비스를 제공하는 프로그램 - 관리가 용이하며 모든 기능을 서버에서 처리하므로 보안 면에서 우수함 2. Servlet - 자바로 만든 CGI(Common Gate Interface - 동적 방식으로 프로그램 제공) 프로그램 - 서버 쪽에서 실행되며 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스 - 자바로 작성되어 있어 자바의 일반적인 특징을 모두 가짐(객체 지향) - 톰캣과 같은 JSP/Servlet 컨테이너에서만 실행될 수 있음 - 서블릿의 여러가지 기능 구현해보기 출력할 구구단의 수를 지정해 주세요. ..
-
6월 2주차 학습 내용 정리
Android 1. Activity와 Intent - Activity : 안드로이드폰에 나타나는 화면 하나하나를 말하며 여러개의 Activity를 사용하여 화면을 구성할 수 있음 - 일반적으로 액티비티 하나 당 xml 파일 하나를 만들어 사용 - Intent : Activity, Service와 같은 안드로이드의 4대 컴포넌트가 서로 데이터를 주고받기 위한 메시지 객체. 명시적 인텐트와 암시적 인텐트로 구분됨 - 명시적 인텐트(explicit intent) : 다른 액티비티의 이름을 명확히 지정할 때 사용 - 암시적 인텐트(implicit intent) : 약속된 액션을 지정하여 안드로이드에서 제공하는 기존 응용 프로그램 실행 - 양방향 액티비티 : 두개의 액티비티가 서로 데이터를 주고 받음 - 양방향 ..
-
6월 1주차 학습 내용 정리
Android 1. Dialog - 화면에 메시지를 나타낸 후 확인, 취소 등 사용자의 선택을 받아들이는 경우 사용 - 사용자에게 중요한 사항을 알려준 후 사용자가 어떤 선택을 하게 하는 것이 주요 목적 - java 파일에서 AlertDialog.Builder 클래스를 통해 생성 가능 - 마지막에 show() 메소드를 써야 화면에 보임 - 정해진 규격 외 다이얼로그가 필요한 경우 다이얼로그용 레이아웃 xml 파일을 만들어 사용함 - 활용 연습 * activity_main.xml * MainActivity.java public class MainActivity extends AppCompatActivity { Button button; String[] data = {"Q(10)", "R(11)", "S(1..
-
5월 4주차 학습 내용 정리
Android 1. 레이아웃 - 레이아웃 : 위젯을 배치하여 안드로이드 화면을 목적에 맞게 배열하도록 함 (view의 하위 클래스) - LinearLayout, RelativeLayout, FrameLayout, TableLayout, GridLayout 등이 있음 - 레이아웃 내 레이아웃 사용 가능하며 LinearLayout이 가장 많이 쓰임 - LinearLayout : 레이아웃의 왼쪽 위부터 아래쪽 또는 오른쪽으로 차례로 배치(orientation으로 방향 설정) - RelativeLayout : 위젯 자신이 속한 레이아웃의 상하좌우 위치를 지정하여 배치, 또는 다른 위젯으로부터 상대적인 위치 지정 - FrameLayout : 위젯을 겹쳐 배치 가능(visibility 설정을 통해 보이고자 하는 위..
-
5월 23일 학습 내용 정리
Android 오늘부터 안드로이드를 배우기 시작했다. Oracle 때도 그랬지만 새로운 걸 배울 때는 항상 뭔가 설렌다. 물론 동작 확인을 할 때 시간이 오래 걸려 설레는 마음이 금방 사그라들긴 했지만 :( 안드로이드에 대한 기초 배경지식을 듣고 Button, TextView, EditText를 사용해봤다. - view : 앱 실행 화면을 구성하는 요소 - 안드로이드 화면에서 실제로 사용되는 것들은 모두 View 클래스의 상속을 받음 - 뷰 클래스를 위젯이라고도 함(Button, TextView, EditText, RadioButton ...) - layout : 다른 위젯을 담을 수 있는 위젯. 위젯을 포함하는 컨테이너 역할 - 보이는 화면(view)에 대한 코드는 xml에 작성함 - 안드로이드 개발 ..
-
[JDBC/활용] SQL과 JFrame으로 CRUD 구현하기
Oracle로 학생 정보 데이터베이스를 구축하고 JDBC로 간단한 학생 정보 관리 기능을 구현해 보았다. 1. SQL 소스 create table tbl_major ( mno number(1) constraint pk_major_mno primary key, mname varchar2(15) constraint nn_major_mname not null ); create sequence seq_major_mno; insert into tbl_major values (seq_major_mno.nextVal, '경영'); insert into tbl_major values (seq_major_mno.nextVal, '화학'); insert into tbl_major values (seq_major_mno.n..
-
5월 3주차 학습 내용 정리
DB - 제약조건 - 테이블에 저장할 데이터를 제약하는 특수한 규칙 - 제약조건을 설정한 열에는 조건에 맞지 않는 데이터를 저장할 수 없음 - 제약조건의 종류 : not null / unique / primary key / foreign key / check - not null : 지정한 열에 null값 허용 안함. null을 제외한 데이터의 중복은 허용 - unique : 지정한 열이 유일한 값을 가져야 함(중복 허용 X). null은 값의 중복에서 제외 - primary key : 지정한 열이 유일한 값이며 null 허용 불가(not null + unique) 한 테이블에 하나의 primary key 지정 가능 - foreign key : 다른 테이블의 열을 참조하여 존재하는 값만 입력 가능 - ch..
-
5월 12일 학습 내용 정리
Oracle / JDBC 1. Oracle - like 'Pattern' : pattern에 두가지 와일드카드를 사용함( % / _ ) * % : 길이와 상관 없이(0개 이상) 모든 문자 데이터를 의미 * _ : 어떤 값이든 상관 없이 한개의 문자 데이터를 의미 -- 성이 이씨인 사원 조회 select ename from emp -- where ename = '이'; -- 이름이 "이"인 사원 -- where ename like '이_'; -- 이름이 외자인 사원 where ename like '이%'; -- 이름이 "랑"으로 끝나는 사원 select ename from emp where ename like '%랑'; -- 이름에 "성"이 들어가는 사원 select ename from emp where ..
-
5월 11일 학습 내용 정리
학원 - Oracle 1. Database(DB) - DBMS : Database Management System(데이터 관리 시스템) - 효율적인 데이터 관리를 위한 조건 * 데이터를 통합하여 관리 * 일관된 방법으로 관리 * 데이터 누락 및 중복 제거 * 여러 사용자(응용 프로그램 포함)가 공동으로 실시간 사용 가능 - 여러 응용 프로그램이 사용할 데이터를 한곳에서 관리하기 위해 데이터베이스를 활용함 - 보통 DB와 DBMS를 따로 구별하지 않고 DB 또는 데이터베이스로 칭함 - 관계형 데이터베이스(Relational Database) * 관계형 데이터 모델 개념을 바탕으로 데이터를 저장 및 관리하는 데이터베이스 * 1980년대 후반부터 가장 많이 사용되고 있는 데이터베이스의 한 종류 * MS-SQL..
-
5월 10일 학습 내용 정리
GUI 구현 테스트 / 파일 복사 1. 파일 복사 - 텍스트 복사 public class TextCopy { public static void main(String[] args) { File src = new File("C:/Windows/system.ini"); // 원본파일에 접근할 객체 File copy = new File("C:/temp/system.txt"); // 복사본 FileReader reader = null; FileWriter writer = null; try { reader = new FileReader(src); writer = new FileWriter(copy); while (true) { int data = reader.read(); if (data == -1) { break..
-
5월 9일 학습 내용 정리
학원 - Thread / Stream 1. Thread - 스레드: 프로그램 내에서 실행되는 작업 단위 - Thread 클래스를 상속받거나 Runnable 인터페이스를 구현하여 스레드 구현 가능 - Thread 클래스를 상속받으면 단일상속의 특성으로 다른 클래스를 상속받지 못하기 때문에 Runnable 인터페이스를 구현하는 방법을 주로 사용 - 스레드를 통해 두가지의 이상의 작업을 동시에 진행할 수 있음 (실제로 동시에 처리되는 것은 아니고 번갈아가며 처리) - 스레드 클래스에서 run() 메서드를 오버라이딩하여 실행할 코드 작성, start();로 실행 - 스레드의 동기화: 하나의스레드가 작업을 완료할 때까지 나머지 스레드는 대기하도록 함 메서드의 반환타입 앞에 synchronized를 붙여주거나 sy..