[12.16] 내일배움캠프[Spring] TIL-34

박상훈·2022년 12월 18일
0

내일배움캠프[TIL]

목록 보기
34/72

[12.16] 내일배움캠프[Spring] TIL-34

1.CS - 애자일 방법론

일반적인(?) 프로젝트 프로세스

1. 폭포수 일처리 프로세스

  • 리더가 전략을 수립하면 조직원들은 전략 달성을 위해 맡겨진 업무를 리더의 통제하에 수행
  • 리더는 전략의 예측도를 높이기 위해 조사와 분석에 많은 시간을 할애
  • 조직원들은 계획대로 과업 일정을 준수하는 것이 성과
    → 실행의 속도가 늦다.
    → 중간에 계획을 변경하는 것이 쉽지 않다.
    → 전략 실행 과정에서 위험이 감지되더라도 조직원들은 이를 묵인한체 계획 고수에 초점을 두는 경향.

애자일 방법론

  • 애자일 팀은 자율과 권한, 책임을 가지고 서로간의 신뢰를 바탕으로 수평적 소통과 협력을 통해 생산성을 높입니다.
  • 반복적이고 점진적인 개발을 통해 변화에 민첩하게 대응하여
  • 제품의 가치를 높여 나가는 개발 방법입니다.
  • 제품과 일하는 방식을 지속적으로 개선해 나가는
  • 끝없는 여정!
  • 프로세스, 툴 < 개인과 개인 간의 상호작용
  • 포괄적 문서 < 동작하는 소프트웨어
  • 계약 < 고객과의 협력
  • 계획 < 변화에 대한 대응
  • Git,GitHub : 애자일을 위한 툴!

👉 개인생각 : 이익을 위해 코딩하고, 상업적으로 코딩 된 프로그램을 납품 판매하는 회사라는 기업에서 과연 계약보다 고객과의 협력, 프로세스 툴보다 개인과 개인의 상호작용을 더 중요시 하는 회사가 많을까..?

애자일 방법 대표 5가지

  1. 스프린트
  • 하나의 프로젝트를 작은 프로젝트로 잘게 나누고, 작은 결과물을 개선해 나간다.
  1. Back Log
  • 계획을 끊임없이 수정하고 피드백을 받는 와중에 업무를 차질 없이 처리하려면 목록이 필수적이다.
  • 백로그는 팀이 결과를 얻기 위해 현시점에서 해야하는 일을 우선순위에 따라 적어놓은 활동 목록이다.
  1. 회고
  • 정기적으로 스프린트 기간에 업무 성과와 개선점에 대해 논의하는 자리. 이때 애자일에서 가장 중요한 메커니즘인 피드백이 작동한다. 모든 방법을 놓쳤다면 회고 하나만이라도 시작해보자!
    회고는 논쟁, 불평하는 자리가 아니다. 팀장만 말을 하고 끝나는 자리도 아니다.
  1. 일일 회의
  • 매일 같은 시간에 프로젝트에 필요한 최신 정보를 공유하기 위해 모인다. 끝난 일, 진행될 일, 업무에 지장을 주는 요소(개인적인 사정도 이야기 해야됨) 이 세 가지에 대해 간략하게 이야기하는 것이 가장 일반적이다. Max 15분을 걸어두고 하는 것이 효율적.
    플랭크 일일 회의라고?
  1. 작업 현황판
  • 일일 회의와 동시에 작업현황판을 최신 정보로 업데이트하며, 새로운 스프린트를 시작할 때 갱신한다.
    시각적으로 팀 전체에 효율적으로 정보를 확산하고 팀의 진행 사항과 업무량, 속도를 조절하는 데도 도움을 준다.
    우리는 GitHub을 이용해, 활용할 수 있겠죠? 업무에선 JIRA 를 많이 씁니다.

2. Jpa연관 관계 다시 보기

  • 이번 숙련과제를 진행하던 중 User, Board의 연관 관계는 유저하나에 여러 게시글을 가질 수 있으며, 반대로 게시글의 입장에서는 여러 글이 하나의 유저를 가질 수 있다. 따라서 Board의 기준에서 봤을 때, @ManyToOne 이라는 것이다.
  • 하지만 User입장에서는 Board@OneToMany이기 때문에, 둘다 넣어 줬던 기억이 있다.
  • 실제 DB Table을 살펴 보면 사실 상 Board에서 유저를 구별하기 위한 외래키USER_ID만 사용된다.
  • 그렇다면 이러한 양방향 연관관계의 설정은 무조건 옳은가????

User Entity

package com.sparta.spartaboard.entity;


import com.sparta.spartaboard.dto.SignUpDto;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Entity(name="users")
@Getter
@NoArgsConstructor
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column
    private String username;

    @Column
    private String pwd;

    //아직은 쓸지 안쓸지 고민중
    //원래의도 -> 회원을 검증해서 그 회원이 작성한 게시물을 List형식으로 User가 갖고 있을 수 있게 하기 위함이였음..
    @OneToMany
    List<Board> boardList = new ArrayList<>();

    public User(SignUpDto signUpDto) {
        this.username = signUpDto.getUsername();
        this.pwd = signUpDto.getPwd();
    }
}

Board Entitiy

package com.sparta.spartaboard.entity;
import com.sparta.spartaboard.dto.BoardRequestDTO;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@Entity
public class Board extends Timestamped {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable = false)
    private String title;

    @Column(nullable = false)
    private String username;

//    @Column(nullable = false)
//    private String pwd;

    @Column(nullable = false)
    private String contents;

    @ManyToOne
    @JoinColumn(name = "USER_ID", nullable = false)
    private User user;

    public Board(BoardRequestDTO boardDto , User user) {
        this.title = boardDto.getTitle();
        this.username = boardDto.getUsername();
//        this.pwd = boardDto.getPwd();
        this.contents = boardDto.getContents();
        this.user = user;
    }
    public void update(BoardRequestDTO boardDto){
        this.title = boardDto.getTitle();
        this.contents = boardDto.getContents();
    }
}

  • 이 문제의 요구사항은 게시물의 회원 식별이 가장 중요하고 필요했다.
  • 따라서 H2 Table을 보면 알겠지만, Board테이블의 USER_ID의 고유값으로 해당 사용자를 식별하고 판단한다.
  • 양방향의 연관관계가 항상 옳은 것은 아니다.
  • 단방향의 설계를 한 뒤 필요에 의한 양방향 설계를 하는 방향으로 진행해야한다.
  • 무조건적인 양방향 설계의 문제점 예시
    -> 만약 User라는 엔티티에 많은 연관 관계가 있는 속성들이 있다고 가정하자.
    -> 그럴 때 모든 속성을 User엔티티에 다 양방향 연관성을 맺게 된다면, User테이블은 하염없이 많은 연관 관계의 값을 가지게 될 것이고, 결국 잡을 수 없이 커지게 될 것 이다.
  • 참조 블로그 : https://jeong-pro.tistory.com/231

3. Java - CodingTest

Level - 0

비밀지도(2018 Kakao Blind)

  • 문제 설명
  1. 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.
  2. 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.
  3. "지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다.
  4. 암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.
  • 입출력 예시
매개변수
n5
arr1[9, 20, 28, 18, 11]
arr2[30, 1, 21, 17, 28]
출력["#####","# # #", "### #", "# ##", "#####"]
class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {

        // 지도는 ""(공백) 또는 "#"으로 구성되어 있는 n길이를 가진 정사각형의 지도
        // 전체의 지도는 지도 두개를 겹쳐서 얻을 수 있다.



        String[] answer = new String[n];

        for(int i=0;i<n;i++){
            StringBuffer str = new StringBuffer();
            for(int j=0;j<n;j++){

                if(arr1[i]%2==0 && arr2[i]%2==0){
                    str.append(" ");
                    arr1[i] = arr1[i]/2;
                    arr2[i] = arr2[i]/2;

                }else if(arr1[i]%2!=0 && arr2[i]%2==0){
                    str.append("#");
                    arr1[i] = arr1[i]/2;
                    arr2[i] = arr2[i]/2;

                }else if(arr1[i]%2==0 && arr2[i]%2!=0){
                    str.append("#");
                    arr1[i] = arr1[i]/2;
                    arr2[i] = arr2[i]/2;
                }else{
                    str.append("#");
                    arr1[i] = arr1[i]/2;
                    arr2[i] = arr2[i]/2;
                }
            }
            str.reverse();
            answer[i] = String.valueOf(str);

        }


        return answer;
    }
}
  • 잘 굴러가니까 문제는 없는 것 같다...ㅎ...
  • 접근은 전공 시간에 배웠던 십진수를 2진수로 바꾸는 나누기 나머지가 떠올라 접근했다.
profile
기록하는 습관

0개의 댓글