728x90

지난 3일간 완성한 프로젝트를 다른 사람들과 공유하고 리뷰하는 시간을 가져보게 되었다.

부족한점

1. 오류에 대한 예외처리 부족(입력 오류, null값에 대한 대처)
2. 접근제한자 미지정
3. 메소드명의 직관성 부족
4. MVC 와 같은 프로젝트 구성
5. TDD 적용 미흡

 

개선할 부분

1. Optional 클래스를 이용한 Null 값 및 오류 처리
2. 접근제한자 설정
3. refactoring을 통한 메소드명 수정
4. refactoring을 통한 프로젝트 구성 변경
5. Stream을 이용한 연속적인 데이터의 처리 추가
6. 다양한 입력값에 대한 상황 대처
7. final을 사용한 상수 관리
8. .gitignore 을 사용한 정보 공유 제한

위와 같은 문제점과 개선사항이 있다고 생각했고 이를 보완하기 위한 공부를 하고자 한다.

728x90

'개발자 공부 > JAVA' 카테고리의 다른 글

데이터 영속성 부여 및 JDBC  (0) 2023.11.13
테킷 - 피어리뷰 추가 학습  (1) 2023.11.12
테킷 - Mission project  (0) 2023.11.08
Map, json, 접근제어자, gradle  (0) 2023.10.27
생성자  (0) 2023.10.25
728x90

 

지난 13일간 배웠던 내용을 복습 및 숙달하는 과정을 위해서 Console에서 동작하는 텍스트 게시판을 만드는 프로젝트를 진행했다.

https://github.com/geniushee/Mission_Heeyeong

CRUD을 구현했다. 게시글의 번호/내용/작성자를 저장하는 데이터를 파일로 저장하고 Json으로 저장하는 기능을 같이 구현했다.

 

TDD를 사용한다고 사용해 봤다. TDD를 처음하는 것이라서 어떻게 해야하나 헷갈렸다. 우선, 원하는 기능을 구현하고 해당 기능이 잘 기능하는지 Test를 작성했다. 테스트를 실행해보면서 잘 작동하는지 확인하고 문제가 있으면 코드를 수정하면서 프로젝트를 완성했다.

프로젝트를 하는 도중 이렇게 하는게 맞는건가 싶었는데, 주어진 시간에 강사님의 TDD 작업 프로세스를 직접 시연해 주면서 어떻게 작업하는지 과정을 보여주었다. 잘못된 부분이 있다는 것을 깨닫게 되었다.

TDD는 구현하고자 하는 기능에 대한 (1)에러가 발생할 수 밖에 없는 test를 먼저 만들고 (2)그것을 해결하기 위한 기능 구현을 반복적으로 실시하고 (3)기능을 완성 하는 것을 점진적으로 반복하는 것이다. 강사님의 작업프로세스를 실제로 지켜보면서 확실하게 확인 할 수 있었다.
하지만 내가 프로젝트를 만들면서 확인 했던 방법은 그냥 단순 테스트에 가깝다. (1)원하는 기능을 만들고 (2)잘 구현되는지 확인만 했을 뿐이다. 물론 잘못됐다고는 생각하지 않는다. 하지만 나중에 현재의 능력으로 구현하기 어려운 기능을 만들고자 할 때 도움을 받을 수 있을 것이기 때문에 이번에 확실히 알아가는 것이 분명히 큰 도움이 될 것이다.

 

또한, 이번에 1번 만든 것을 다시 만들어 보면서 지금까지 사용한 기술을 숙달할 수 있었고, 한번 사용한 기술 중 반복적으로 사용할 수 있는 기술은 스니펫을 만들고 언제든 사용할 수 있도록 해야겠다고 느꼈다. 언제나 구글링만 할 수는 없지 않은가... 효율 떨어지게.

728x90

'개발자 공부 > JAVA' 카테고리의 다른 글

테킷 - 피어리뷰 추가 학습  (1) 2023.11.12
테킷 - 피어리뷰  (0) 2023.11.12
Map, json, 접근제어자, gradle  (0) 2023.10.27
생성자  (0) 2023.10.25
숙달학습  (2) 2023.10.23
728x90

Javascript 및 부스트트랩

Javascript를 처음 사용해 보았고, 부스트트랩도 처음사용해 보았다. 처음 사용해보는 것이라 어려움이 있었으나, Java와 비슷한 부분이 많아서 그래도 적응하는데 어려움은 없었다. 부스트트랩을 사용하니 여러 태그, 클래스 등을 가져오는데 굉장히 편리해졌다. 하지만 교육이 실습 위주로 이루어지고 구체적인 원리나 설명은 부족하여 추가적인 공부를 많이 요구하는 것이 아쉽다.

 

HTML, CSS

개인적으로 학습한 내용이 더욱 자세하게 다루어서 이부분은 아쉽게도 더 얻어가는 것은 없었다.

728x90

'개발자 공부' 카테고리의 다른 글

지연로딩에 관한 예외 및 트랜섹션  (0) 2023.11.29
쿠키 & 세션  (1) 2023.11.20
TDD, Github flow  (0) 2023.10.31
리팩토링, 공부방법  (0) 2023.10.26
선형방정식과 선형시스템  (0) 2023.08.29
728x90

join

2개 이상의 테이블을 병합하는 명령어이다. inner join, left join, right join 3가지가 있으며, 개인적으로는 left join을 가장 많이 사용하여 inner join의 사용법을 잊어버렸었다. inner join의 경우에는 병합되는 테이블의 모두 있는 값들만 출력한다. 사용하기에 따라서는 left나 right보다 유용 할 수있다.

평소에는 join 시 On에  조건을 1가지만 입력했는데, 이번 강의에서 2개 이상을 입력하여 결합해보면서 결합조건에 대한 유연함을 얻을 수 있었다.


subquery

쿼리 안에 또다른 쿼리를 넣는 것을 서브쿼리라고 한다. 서브쿼리를 사용하면 쿼리 자체가 복잡해지는 단점이 있다. 하지만 서브쿼리를 사용하면서 다양한 방법으로 쿼리를 활용할 수 있다는 장점이 있다. 하지만 2개 이상의 서브쿼리를 사용하는 것은 지양하도록 하자. 생각보다 쿼리가 난잡해지는 단점이 있다.


union

join과는 다르게 서로 다른 테이블을 수직으로 병합하는 방법이다. union은 중복을 제거하고 병합하는 반면 union all을 사용하면 모든 데이터를 병합할 수 있다. 주의해야할 부분은 컬럼의 위치이다. union시 컬럼의 위치가 서로 다르거나 컬럼의 수가 일치하지 않아도 수직병합을 해버리기 때문에 데이터가 이상해질 수 있는 단점이 있으니 주의하도록 하자.

728x90

'개발자 공부 > Database' 카테고리의 다른 글

스프링 트랜잭션 격리 수준 (Isolation Level) 정리  (1) 2025.03.19
RDBS 및 MySQL 학습  (0) 2023.10.31
728x90

DATABASE

DATABASE란 데이터의 모음 또는 데이터베이스 관리시스템(DBMS)을 사용하는 데이터 저장소의 모음이다.
관계형 데이터베이스 중 가장 널리 쓰이는 MySQL의 강의를 했다.
MySQL의 문법자체를 난이도가 높지 않으나, 데이터를 설계한 경험이 부족하여 데이터를 어떻게 설계해야하는지에 대해 지식을 얻어가지 못하는 아쉬움이 있다. 이미 MySQL은 개인적으로 학습을 한 차례 했기 때문에 다시 해보는데 어려움은 없었으나, 부족한 시간에 많은 내용을 다루다 보니 진도가 매우 빠르게 진행되었다.

SQL공부 시 추천하는 사이트

https://opentutorials.org/course/3162

 

DATABASE1 - 생활코딩

수업소개 이 수업은 정보기술의 심장인 데이터베이스에 대한 포괄적인 소개를 담고 있습니다. 수업대상 이 수업은 구체적인 데이터베이스 제품을 다루지 않습니다. 데이터베이스라는 복잡한

opentutorials.org

참고 - datebase Ranking

https://db-engines.com/en/ranking

 

DB-Engines Ranking

Popularity ranking of database management systems.

db-engines.com

 

728x90

'개발자 공부 > Database' 카테고리의 다른 글

스프링 트랜잭션 격리 수준 (Isolation Level) 정리  (1) 2025.03.19
MySQL 2  (0) 2023.11.01
728x90

TDD(Test-driven development)

오늘 강의의 큰 맥락은 TDD였다. TDD란 테스트 주도 개발로써 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스이다.
요구사항을 검증하는 자동화 테스트 케이스를 작성한다. 그리고 테스트 케이스를 통과하기 위한 최소한의 코드를 작성한다. 마지막으로 작성한 코드를 리팩토링한다. 테스트 케이스 작성 - 코드 개발 - 리팩토링을 반복하면서 조금씩 조금씩 원하는 기능을 구현하는 것을 목표로 한다.
TDD를 이용했을 때의 장점은 아주 낮은 단계의 계단을 계속해서 올라감으로써 초보자가 보다 쉽게 접근할 수 있도록 해줄 수 있고, 개발 과정에서 생기는 오류를 찾는데 도움을 얻을 수 있다. 예를 들어 미로 찾기 프로그램을 만든다고 했을 때, 앞으로가기 구현 -> 회전 구현 -> 통행가능여부 확인 구현 -> 반복을 통한 길찾기 등 단계별로 테스트 케이스를 만들고 이를 구현하는 방법이다.

1. 자동화 테스트 작성을 위한 gradle 의존성 추가

testImplementation 'org.assertj:assertj-core:3.24.2'

2. 자동화 테스트 작성을 위한 import

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

3. 자동화 테스트 작성을 위한 입출력 설정

package com.ll;

import java.io.*;
import java.util.Scanner;

public class testUtil {
    public static Scanner genScanner(String input) {
        InputStream in = new ByteArrayInputStream(input.getBytes());

        return new Scanner(in);
    }

    public static ByteArrayOutputStream setOutToByteArray() {
        final ByteArrayOutputStream output = new ByteArrayOutputStream();
        System.setOut(new PrintStream(output));
        return output;
    }

    public static void clearSetOutToByteArray(ByteArrayOutputStream output) {
        System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
        try{
            output.close();
        }catch (IOException e){
            throw new RuntimeException(e);
        }
    }
}

4. 사용 예시

package com.ll;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.io.ByteArrayOutputStream;
import java.util.Scanner;
import static org.assertj.core.api.Assertions.assertThat;

public class AppTest {
    @Test
    @DisplayName("testutil genScanner 테스트")
    void t1(){
        Scanner scanner = testUtil.genScanner("""                
                문장1
                문장2
                문장3""".stripIndent());
        String cmd = scanner.nextLine();
        String content = scanner.nextLine();
        String authorname = scanner.nextLine();

        assertThat(cmd).isEqualTo("문장1");
        assertThat(content).isEqualTo("문장2");
        assertThat(authorname).isEqualTo("문장3");
    }

    @Test
    @DisplayName("testutil.setOutToByteArray() 테스트")
    void t2(){
        ByteArrayOutputStream byteArrayOutputStream = testUtil.setOutToByteArray();

        System.out.println("테스트 문장");

        String out = byteArrayOutputStream.toString().trim();

        assertThat(out).isEqualTo("테스트 문장");

        testUtil.clearSetOutToByteArray(byteArrayOutputStream);
        System.out.println("이제는 화면에 출력됩니다.");
    }
}

Github flow

협업을 진행하기 위해 github에서 리포지토리를 공유하고 issue작성, branch 생성, branch protection rull 작성, PR(Pull Requests)요청하는 과정을 배웠다. 대단한 기술이 필요한 것은 아니지만 issue작성이나 branch 생성과 같은 일들은 간단하게 테스트 해보려고 해도 누구는 이렇게 쓰고 누구는 다르게 쓰고 하면서 branch들이 테스트를 시작하자마자 헷갈렸고 이슈의 제목과 작성 내용, 방법 등이 아직은 익숙하지 않았다. 많이 사용하면 보다 나아지리라 생각된다. 또한, 이슈를 작성하면서 프로젝트 관리자의 입장에서 문제해결, 기능 추가, 보수 등 생각할 꺼리들이 있어서 도움이 될 것 같다.

Git pull origin main // 메인 브랜치 최신화 
git checkout -b e/1 // <- 브랜치명; 서브 브랜치 작성 
//1번 E/1) 작업; 서브 브랜치 작업 
Git add && git commit -m "작업" //2번 서브 브랜치 커밋 
// 1번 2번 반복…
Git add && git commit -m "작업" //서브 브랜치 커밋 
Git push origin e/1 // 서브 브랜치 푸쉬
// Github PR 생성(e/1 -> main)
// 투표
// 투표 통과
// merge
Git branch -d e/1  // E/1브랜치 삭제(반영완료된 브랜치)
Git fetch —prune  // 혹시 모를 잔여(기록)데이터 삭제

 

728x90
728x90

Map

전날에는 ArrayList를 사용하여 데이터를 저장하는 방법을 학습했다.
오늘은 ArrayList와는 다른 HashMap을 학습했다.
ArrayList는 add를 통해 데이터을 받고 자동으로 index를 지정하여 차곡차곡 데이터를 저장하는 반면, HashMap은 put을 이용해 데이터를 받고 'Key-Value'쌍으로 데이터를 저장한다. ArrayList 대비 장점으로는 원하는 데이터값을 찾기가 용이하다는 점이고, 단점으로는 입력이 조금더 번거롭다는 것이다.

List<String> list = new ArrayList<>();
list.add("Hello");
list.add("world");

Map<String, String> map = new HashMap<>();
map.put("first", "Hellow");
map.put("second", "world");

이러한 점을 이용하여 일관되고 단순한 데이터를 쌓을 경우 ArrayList를 활용하고 사용자정보(이름, 나이 등)과 같이 특정한 정보를 입력하는데 용이할 것으로 본다.


json

JavaScript Object Notation의 약자로 Map과 유사하게 'Key-Value'쌍으로 데이터를 저장하는 데이터포멧이다. 주로 인터넷에서 사용되는 데이터포멧이나, 언어에 관계없이 사용되는 포멧이다. 가독성이 좋고 경량이라는 점이 주요 장점이다.

오늘 GPT의 도움으로 Java에서 json으로 데이터를 변경하여 저장하는 코드를 작성해 보았으나, 아직은 편한지 아닌지 잘 모르겠다.


접근제어자

textboard를 만들면서 작성하는 코드가 많아지며 refactoring을 수시로 진행하고 있다.
이 과정에서 public, private의 접근제어자를 이용하여 각 클래스, 필드, 메소드 등에 관한 접근을 관리하는 것을 배웠다.
기본적으로 각 클래스의 모든 필드는 private를 기본으로 하며 필요에 따라 Getter와 Setter를 만들어 접근한다고 한다.
실전에서는 클래스와 필드가 워낙 많아 Getter/Setter가 엄청 많이 필요한데 이러한 것을 간단하게 처리해주는 plugin인 Lombok을 사용하면서 Gradle이 무엇인지 알게되었다.

Gradle은 java에서 필요로하는 여러가지 기능을 사용자 대신 자동으로 수행하는 역할을 해주며, 라이브러리 다운로드 등을 수행해준다. 일종의 비서랄까.

또한, plugin을 이용하면서 복잡한 코드가 간소화되고 편의성이 증가한 것을 느끼면서, 저런 프로그램을 개발하는 것도 한번 경험해보고 싶다는 생각을 했다.

 

728x90

'개발자 공부 > JAVA' 카테고리의 다른 글

테킷 - 피어리뷰  (0) 2023.11.12
테킷 - Mission project  (0) 2023.11.08
생성자  (0) 2023.10.25
숙달학습  (2) 2023.10.23
상속  (0) 2023.10.23
728x90

refactoring

wiki : https://ko.wikipedia.org/wiki/%EB%A6%AC%ED%8C%A9%ED%84%B0%EB%A7%81

 

리팩터링 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 리팩터링(refactoring)은 소프트웨어 공학에서 '결과의 변경 없이 코드의 구조를 재조정함'을 뜻한다. 주로 가독성을 높이고 유지보수를 편하게 한다. 버그를 없애

ko.wikipedia.org

리팩터링이란 결과의 변경 없이 코드의 구조를 재조정함을 의미한다고 한다.
금일 수업에서 textboard를 구현하는 과정에서  1개의 method에 다수의 기능이 포함되기 시작하면서, 강사님이 중간에 리팩터링을 시작했다. 나에게는 생소한 단어였기 때문에 무엇인지 잘 몰랐다. 하지만 강사의 설명과 리팩터링 위키를 찾아보면서 다음과 같이 간략하게 볼 수 있을 것 같다.

  • 코드의 가독성을 높여 유지보수성을 개선한다.
  • 확장가능성을 확보한다.
  • 이를 실현하기 위해 하나의 기능을 너무 길게 작성하지 않고,
  • 특정한 기능을 만족하기 위해 작성한다.

리팩터링을 함으로써 이정표 or 가이드를 만들고 구현하고자 하는 각 기능을 분산하고 가독성을 높이는 것을 목표로 한다. 강사분께서 리팩터링을 시현해 줌으로써, 작은 프로그램이지만 향후 프로그램 설계를 어떤 방향으로 해야할지 조금 엿볼 수 있는 기회였다.


공부방법

초보자가 코딩공부 중 모르는 것이 생겼을 때, 공부방향을 제시받았다.
모르는 것을 찾고 적용한다. 이러한 일련의 과정에서 중간에 테스트 즉, 새로 학습하게된 지식을 실험을 통해 어떤 식으로 기능하는지, 어떤 오류가 발생할 수 있는지 등 다양한 시도를 해보고 필요한 곳에 적용하도록 조언을 받았다.
이렇게 함으로써, 코딩 시냅스(?)을 생성해 생각하는 방법을 바꿔 실력을 향상할 수 있다고 한다.
실제로 나도 직접 코딩을 했던 부분들은 기억이 잘 나는데 반해, 눈코딩(?)만 했던 것들은 상대적으로 기억이 잘 나지 않고 오류가 발생했을 때도 대처가 어렵다. 간혹 급한마음에 바로 적용하는 경우가 있는데 아직은 지양해야하지 않을까 싶다.

728x90

+ Recent posts